VC6.0下調用Dll文件提供的函數接口和全局變量

複習一下VC: 本文摘自: http://gauzeehom.iteye.com/blog/1031130


函數接口:

首先把生成的Dll文件(如RegularDll.dll和RegularDll.lib)拷貝到當前工程所在文件夾,調用有兩種方法:

1)動態方法:
使用LoadLibrary和GetProcAddress等函數,例
typedef void (*lpFun)(void);
HINSTANCE hDll;
hDll = LoadLibrary("RegularDll.dll");
if (NULL==hDll) {
MessageBox("Dll load failed!");
}
lpFun pShowDlg = (lpFun)GetProcAddress(hDll,"ShowDlg");
if (NULL == pShowDlg) {
MessageBox("Load function \"ShowDlg\" failed!");
}
pShowDlg();*/

2)靜態聲明方法:
創建Dll的工程中,函數聲明和定義時用 _stdcall 修飾,例 
void _stdcall ShowDlg(void){...} 
在調用dll的工程的文件中,在文件頭部聲明庫和函數,如下例
#pragma comment(lib,"RegularDll.lib")
void _stdcall ShowDlg(void);
調用時直接ShowDlg()就可以了。
以上兩種方法在VC6.0中調試成功,保證可用!

有的文章中說這樣聲明即可:
#pragma comment(lib,"RegularDll.lib")
void ShowDlg(void); 
但在VC6.0下會報找不到函數ShowDlg的錯誤,不知是不是我沒有設置好?

全局變量(訪問Dll文件中的全局變量)

在創建Dll的工程中,在頭文件中這樣聲明:
//lib.h
#ifndef _LIB_H
#define _LIB_H
#ifdef DLL_FILE
extern int dllGlobalVar;
#else
extern int _declspec(dllimport) dllGlobalVar; 
#endif

在創建Dll的工程的cpp文件中先定義DLL_FILE,再定義該變量,如下例:
//lib.cpp
#define DLL_FILE
#include "lib.h"
int dllGlobalVar; //define
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch(ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
dllGlobalVar = 100; // initialization when dll attached
break;
……
}
int _stdcall GetGlobalVar()
{
return dllGlobalVar; // use the global variable
}

在調用Dll文件的工程中,需要訪問該全局變量時,聲明如下:
#include "..\\lib.h"
#pragma comment(lib,"dllTest.lib")
然後可以當作普通的全局值變量使用和修改了!
printf("%d \n", dllGlobalVar);
dllGlobalVar = 234;
printf("%d \n", dllGlobalVar);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章