當前位置:編程學習大全網 - 源碼下載 - VB怎麽調用DLL文件 這個DLL文件是自己用VB寫的放在主程序壹個文件夾裏面的,網上找了很多辦法都不行。

VB怎麽調用DLL文件 這個DLL文件是自己用VB寫的放在主程序壹個文件夾裏面的,網上找了很多辦法都不行。

網上 的壹篇文章,看完應該對妳有所幫助

再談在VB中調用VC++開發的DLL

作者:未知 來源:月光軟件站

近日開發壹個程序,用到動態鏈接庫,在VB中調用時遇到了壹些問題。我查了壹些資料,也看了壹下CSDN上的文章,感覺這些文章對在VB中調用VC++開發的DLL這壹問題闡述得不夠詳細。因此在我的問題得到解決之余,特為初接觸DLL的朋友們寫下這篇文章。

本文中關於調用約 定的解決方法,也適用於解決其它編程語言之間DLL調用的兼容問題。

①關於DLL的創建與調用

使用VC++的向導即可。具體操作如下:打開菜單“File\New”→選擇“Projects\Win32 Dynamic-Link Library”→選擇“A simple DLL project”即可。這時系統會自動生成3個文件:*.cpp,stdafx.cpp,stdafx.h。

之後將入口函數DLLMain()補充完整,再添加妳自定義的函數的代碼。如果妳自定義的函數很多,可以將這些函數的聲明部分統壹寫入壹個頭文件中。再在.cpp文件首部用“# include”語句引入這個頭文件。註意函數聲明前要加上“__declspec(dllexport)”。

(如果妳建DLL時選擇的是第三種類型(加入示例代碼),則在函數聲明及定義前都要加上系統定義的宏“*_API”。)

在VB中用如下語句聲明:“Declare Function 函數名 Lib "完整路徑\文件名.dll" [Alias "函數別名"] (ByVal 變量1 As 類型1, ByVal 變量2 As 類型2,…) As 類型3”,與調用API函數類似。

註意:若在窗體代碼的“通用”部分使用,“Declare”前要加“Private”;若在Moudle中使用,“Declare”前要加“Public”。若將DLL文件放在“\Windows\System”或“\WinNT\System32” 目錄下,“Lib”後只寫出DLL主文件名即可。

具體的實例代碼見④(修正後的,可直接運行)。

②關於入口點

如上編寫Cipher.dll,運行,出現錯誤信息“找不到DLL入口點(Error 53)”。出現這壹錯誤的原因是C++編譯器在編譯時對函數名Encrypt作了修改。打開快速查看程序(D:\WINNT\System32\Viewers\QuikView.exe),將Cipher.dll拖入查看窗口,找到字段“?Encrypt@@YAHHH@Z”,發現函數名被加了 壹串字符。

解決方法有二。第壹,直接在VB聲明中將“?Encrypt@@Y AHHH@Z”作為別名放在“Alias”後即可;第二,在Cipher.dll代碼中在語句“__declspec(dllexport) int __stdcall Encrypt(int p, int k); ”前加上“extern "C" ”,編譯後,用QuikView查看,函數名變為“_Encrypt”,之後再在VB聲明中做相應調整即可。

(對於使用宏的DLL,在“#define”語句中,對宏“Cipher_API”的替換值做更改即可。)

進行了③的更改後,程序又找不到入口點了。再用QuikVie w查看,發現函數名變為“_Encrypt@8”。還有解決方法。在Cipher.dll工程中添加壹個文本文件,命名為“Cipher.def”,添加代碼如④。編譯後再用QuikView查看,函數名變回“Encrypt”,在VB中調用,運行正常。

③關於調用約定

采用②中第二種解決方法,運行,出現錯誤信息“DLL調用約定錯誤(Error 49)”。原因是調用約定***有4種方式:__fastcall、__pascal、__stdcall、__cdecl,VC++默認調用方式為__cdecl,而VB默認調用方式則為__stdcall。解決方法是,更改代碼如下(限定調用方式):

extern “C” __declspec(dllexport) int __stdcall Encrypt(int p, int k);

…………

int __stdcall Encrypt(int p, int k)

{

int c = p+k;

return c;

}

④源代碼

Cipher.dll:

Cipher.cpp:

//引入預編譯頭文件

#include “stdafx.h”

//聲明我的函數

extern “C” __declspec(dllexport) int __stdcall Encrypt( int p, int k );

//DLL入口函數

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

switch( ul_reason_for_call )

{

case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}

//我的函數

int __stdcall Encrypt ( int p, int k )

{

int c = p + k ;

return c ;

}

Cipher.def:

LIBRARY Cipher

EXPORTS Encrypt

編譯後,將Cipher.dll復制到“D:\WINNT\System32”目錄。

在VB中調用:

Option Explicit

Private Declare Function Encrypt Lib “Cipher” _

(ByVal p As Long, ByVal k As Long) As Long

Private Sub Form_Load()

Dim c As Long

c = Encrypt(24, 8)

Text1.Text = c

  • 上一篇:JUnit主要用來完成什麽?
  • 下一篇:易途(上海)旅遊咨詢服務有限公司怎麽樣?
  • copyright 2024編程學習大全網