( ) ( )混合程式設計例項

2021-03-31 17:52:56 字數 1716 閱讀 1662

vb(exe)/vc(dll)混合程式設計例項

首先,開啟vc,然後新建乙個win32 dynamic-link library工程,然後在出現的工程型別中選擇預設的空專案"a empty dll project"(即不包含任何檔案的工程),然後結束嚮導。

手動新增兩個檔案,乙個"c++ source file",乙個"text file",請注意兩個檔案的字尾,在原始檔命名時可以不寫字尾名,那麼就預設為cpp檔案(即c++檔案),也可以寫上".c"來表示是c語言原始檔(個人偏好是c語言,事實上系統dll中都是用c語言寫的,特別要指出的是,這裡字尾不一樣,原始檔中內容也要相應改變,具體不同處後面會指出);text file取名時請把字尾名改為def,因為這個檔案是輸出函式列表定義檔案。

好了,我們就只需要這兩個檔案就可以了!原始檔用來定義函式和具體函式內容,而def檔案中列出所要輸出的函式。下面是**了,首先要說明的是,dll專案和傳統的exe工程一樣,有自己的主函式(就相當於main()和winmain()函式),名字是dllmain。

思路如下,寫乙個

/*dll工程主函式,這裡呼叫不呼叫我們要輸出的函式無關緊要了。*/

bool apientry dllmain( handle hmodule, 

dword  ul_reason_for_call, 

lpvoid lpreserved

)return true;

}int __stdcall getnum(int num)     /*具體實現*/

mydll.def內容:

exports    

getnum                  /*這樣就表示了這個dll檔案的輸出函式*/

/*如果輸出函式有多個,就換行繼續輸入函式名稱就可以了*/

編碼完成,編譯完成以後,就可以在工作目錄下的

debug目錄下有乙個mydll.dll檔案了,把這個檔案複製到系統目錄下,然後就可以開啟vb呼叫一下這個dll檔案輸出的函式了。

這個要特別要注意的是:

extern int __stdcall getnum(int num);

extern"c"int __stdcall getnum(int num);   /*多了乙個「c」*/

這是因為他們的原始檔是預設的c++檔案(.cpp),所以為了符合c語言呼叫規則,就加了乙個"c"字元,但是這裡我用的原始檔是純的c語言檔案(.c),所以不能再加"c",不然要報錯的,請特別注意!

⑹好了,接下來的是

vb這方面的事了,具體的我不多說了,就是乙個函式宣告而已了,還是得重複得宣告一下:

請注意函式名稱和引數都必須完全和你在dll中定義的完全匹配!!

特別是大小寫要完全匹配!

private declare function getnum lib "mydll.dll" (byval num as integer) as integer

對於dll輸出函式中的引數含有資料指標引數,那麼在vb中宣告把byval改為byref就可以將陣列指標傳遞給dll了~!譬如:

int __stdcall array(int *a,int num);

declare function (byref samplea() as long, byval numsam as integer) as integer

C C 混合程式設計

c中呼叫c c 中呼叫c都會用到extern c 但兩者的意義卻大不一樣!例 c void foo int x c c code extern c void foo int x 讓c 聯結器能通過過類似於 foo來查詢此函式,而非類似於 foo int這樣的符號。使用extern c 則是告訴編譯器...

C C 混合程式設計

分類 linux c c 2012 12 26 09 51 655人閱讀收藏 舉報cc 混合程式設計 externc cplusplus 現在,我們就來慢慢的了解吧。一 extern c 的作用 最重點 1.extern c 的真實目的是實現類c和c 的混合程式設計。extern c 是由 提供的乙...

C C 混合程式設計

現在,我們就來慢慢的了解吧。一 extern c 的作用 最重點 1.extern c 的真實目的是實現類c和c 的混合程式設計。extern c 是由 提供的乙個連線交換指定符號,用於告訴 這段 是 函式。extern c 後面的函式不使用的c 的名字修飾,而是用c。這是因為c 編譯後庫中函式名會...