第一篇:C#如何判斷程序調(diào)用的exe已結(jié)束——二個方法
二個方法:以運(yùn)行系統(tǒng)記事本為例
方法一:這種方法會阻塞當(dāng)前進(jìn)程,直到運(yùn)行的外部程序退出
System.Diagnostics.Process exep = System.Diagnostics.Process.Start(@“C:WindowsNotepad.exe”);
exep.WaitFor();//關(guān)鍵,等待外部程序退出后才能往下執(zhí)行
MessageBox.Show(“Notepad.exe運(yùn)行完畢”);
方法二:為外部進(jìn)程添加一個事件監(jiān)視器,當(dāng)退出后,獲取通知,這種方法時(shí)不會阻塞當(dāng)前進(jìn)程,你可以處理其它事情
System.Diagnostics.Process exep = new System.Diagnostics.Process();
exep.StartInfo.FileName = @“C:WindowsNotepad.exe”;
exep.EnableRaisingEvents = true;
exep.ed += new EventHandler(exep_ed);
exep.Start();
//exep_Exited事件處理代碼,這里外部程序退出后激活,可以執(zhí)行你要的操作
void exep_Exited(object sender, EventArgs e)
{
MessageBox.Show(“Notepad.exe運(yùn)行完畢”);
}
提問者評價(jià)
謝謝了,我開始也想到用exited這個事件,總是不觸發(fā),原來還得設(shè)置屬性啊
第二篇:文中介紹了一種實(shí)現(xiàn)VB調(diào)用C語言程序的方法
文中介紹了一種實(shí)現(xiàn)VB調(diào)用C語言程序的方法-動態(tài)連接庫法,給出了動態(tài)鏈接庫制作的一般框架,通過實(shí)例描述了動態(tài)連接庫的實(shí)現(xiàn)及其制做方法、編程步驟,這種方法具有普遍的意義。
關(guān)鍵詞 VB 動態(tài)連接庫DLL C程序
一、引言 Visual Basic(以下簡稱VB)是一種可視化的面向?qū)ο蟮木幊陶Z言,以其編程簡單、快捷等特點(diǎn),深受廣大WINDOWS程序員的青睞。利用VB開發(fā)界面友好、操作方便的軟件只需很短的時(shí)間。但是VB運(yùn)行速度較慢,對于龐大的科學(xué)計(jì)算問題,VB的這種慢速會使人難以忍受。C語言是國際上非常流行的一種中級編程語言,以其靈活、高效等優(yōu)點(diǎn)而獲得廣泛應(yīng)用,許多的應(yīng)用程序都是用C語言在DOS環(huán)境下編寫而成。那么如何發(fā)揮VB和C這兩種語言的優(yōu)勢,用VB設(shè)計(jì)一種良好的for windows界面來調(diào)用C語言程序,即實(shí)現(xiàn)VB調(diào)用C語言程序呢?現(xiàn)有的文獻(xiàn)只提到動態(tài)鏈接庫(以下簡稱DLL)可以將這兩種語言連接起來,但有講動態(tài)鏈接庫DLL的制做及其編程方法。本文詳細(xì)介紹了Borland C環(huán)境下制作動態(tài)鏈接庫以及VB調(diào)用for dos動態(tài)鏈接庫的的方法、步驟,并通過實(shí)例描述VB調(diào)用C程序的全過程。
二、用Borland C編寫DLL程序的方法 要想實(shí)現(xiàn)VB調(diào)用C程序,首先需要用Borland C編寫動態(tài)連接庫DLL程序(假設(shè)DLL程序取名為example)。動態(tài)鏈接庫包含四個文件:C語言源程序(.C)、模塊定義文件(.DEF)、原型函數(shù)文件(.H)和工程文件(.PRJ)。下面分別詳細(xì)介紹一下這四種文件的具體結(jié)構(gòu)。
1、編寫C語言源程序的框架:C語言源程序(example.C),它包括三種函數(shù):入口函數(shù)、輸出函數(shù)和終止函數(shù)。其具體 結(jié)構(gòu)如下:
/*************************************/ /* 文件名: example.C */ /*************************************/ #include
2、模塊定義文件(.DEF)的結(jié)構(gòu)和各段的意義 模塊定義文件的結(jié)構(gòu)如下:
/*************************************/ /* 文件名: example.DEF */ /*************************************/ LIBRARY example /* DLLname */ DESCRIPTION ' example.DLL' EXETYPE WINDOWS CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE SINGLE HEAPSIZE 1024 EXPORTS example @1 WEP @2 關(guān)鍵字LIBRARY是把這個模塊視為一個DLL,庫的名字example跟在其后,且必須與該庫的名字、DEF中的DLL的文件名相一致。DESCRIPTION語句采用一個字符串,其長度可達(dá)128 個字符,通常用它來保存模塊描述的信息。EXETYPE windows語句每個windows應(yīng)用程序和 DLL都需要。DATA語句定義該庫數(shù)據(jù)段的內(nèi)存屬性,關(guān)鍵字MOVEABLE允許內(nèi)存管理程序在 必要時(shí)移動內(nèi)存段,關(guān)鍵字SINGLE是DLL必要,因?yàn)镈LL總是有一個單一數(shù)據(jù)段,而不管訪 問它的應(yīng)用程序的數(shù)量。HEAPSIZE語句用來定義一個DLL局部堆的初始規(guī)模,執(zhí)行局部內(nèi) 存分配的DLL必須在庫啟動時(shí)使該堆初始化,堆的大小被傳送給DLL的LiEntry的程序。然 后用該堆的大小調(diào)用Locallnit使DLL的局部堆初始化。EXEPORTS語句定義將被用作來自應(yīng)用程序或來自其它DLL入口點(diǎn)的程序,windows利用這個信息建立一個序數(shù)入口值,序數(shù)入口值是一個優(yōu)化的值,允許動態(tài)連接機(jī)制更快塊操作且使用較少的內(nèi)存。一般來說,模塊定義文件(.DEF)的結(jié)構(gòu)除取動態(tài)庫的名字不同外,其它結(jié)構(gòu)都是固定的。3.建立原形函數(shù)文件(.H)原形函數(shù)的功能是進(jìn)一步聲明調(diào)用函數(shù)的函數(shù)名和傳遞的參數(shù),其形式為: /*************************************/ /* 文件名: example.H */ /*************************************/ extern “C” int _export FAR PASCAL example(int param1,...,char param n);4.建立工程文件(.PRJ)工程文件中包含有example.C、example.DEF兩個文件后,然后編譯連接生成動態(tài)鏈接庫即可。
以上是制作動態(tài)連接庫的框架,現(xiàn)在通過一個實(shí)例介紹制作動態(tài)鏈接庫的方法。如要求程序完成功能為:打開一個數(shù)據(jù)文件讀出前兩個數(shù)據(jù),將這兩個數(shù)與所傳遞的兩個參數(shù)相加,返回它們的和。設(shè)該DLL程序的名字為ADD。
第一步:在Borland C++環(huán)境下編輯.C文件、.DEF文件和.H文件,并建立.PRJ文件。如
(1)編寫C語言源程序清單:
/*************************************/
/* 文件名: ADD.C */ /*************************************/ #include
fp=fopen(filein,“r”);if(fp==NULL){ exit(0);} int temp1=0,temp2=0;fscanf(fp,“%d”,&a);fscanf(fp,“%d”,&b);temp1=x+a;temp2=y+b;temp1=temp1+temp2;fclose(fp);return(temp1);} /*退出函數(shù)*/ int FAR PASCAL WEP(int/*SystemExit*/){ return(1);} 2)ADD.DEF文件的程序清單:
/*************************************/ /* 文件名: ADD.H */ /*************************************/ LIBRARY ADD DESCRIPTION 'ADD.DLL' EXETYPE WINDOWS CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE SINGLE HEAPSIZE 1024 EXPORTS ADD @1 WEP @2(3)ADD.H程序清單:
/*************************************/ /* 文件名: ADD.H */ /*************************************/ extern “C” int _export FAR PASCAL add(int x,int y,char *filein);(4)建立工程文件:
在Borland C++環(huán)境下的project項(xiàng)中打開open project file項(xiàng)并建立ADD.prj,在add item中加入ADD.C文件和ADD.DEF文件即可建立工程文件。第二步,在Borland C的options項(xiàng)的Applation中選擇Windows DLL,再在Compile中選擇Build all,這樣就可生成動態(tài)鏈接庫ADD.DLL供VB調(diào)用。
三、VB3.0調(diào)用動態(tài)鏈接庫DLL方法 制作好DLL之后,就可以用VB調(diào)用它,實(shí)現(xiàn)VB調(diào)用C程序。VB程序要使用DLL中的函數(shù),首先必須要有特殊的聲明,用Declare聲明語句在窗體級或模塊級或全局模塊的代碼聲明段進(jìn)行聲明,將動態(tài)鏈接庫中的函數(shù)聲明到VB中,供VB程序調(diào)用。語句格式為:Declare Sub 過程名Lib摽鈹黚_n[ Alias “ 別名]([ByVal 參數(shù)AS類型]),或?yàn)镈eclare Function函數(shù)名Lib摽鈹黚_衃 Alias ” 別名]([ByVal 參數(shù)AS類型])AS類型在聲明中首先用Declare關(guān)鍵字表示聲明DLL中的函數(shù)。在C語言中有的函數(shù)類型為VOID,它表示不具有返回值,則必須用關(guān)鍵字Sub將其聲明成過程。有的函數(shù)具有返回值,則必須用關(guān)鍵字Function將其聲明成函數(shù),并且在聲明語句的最后要用AS關(guān)鍵字指明函數(shù)返回值的類型。例如上面的ADD.DLL在VB中就可以聲明為: Declare Function ADD Lib撫c:ADD.dll敚―ByVal X AS Integer, ByVal Y AS Integer ,ByVal filein as string)AS Integer通過此聲明語句將函數(shù)ADD聲明到VB中,便可直接調(diào)用。
四、結(jié)束語 以上詳細(xì)介紹了Borland C環(huán)境下制作動態(tài)鏈接庫以及VB調(diào)用for dos動態(tài)鏈接庫的方法、步驟,并通過實(shí)例說明VB調(diào)用C語言程序的方法。舉例程序ADD經(jīng)VB3.0編譯,在486微機(jī)上調(diào)試通過。本文介紹的方法具有廣泛的意義,也完全適用于C++ 語言程序。