複習一下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();*/
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中調試成功,保證可用!
創建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的錯誤,不知是不是我沒有設置好?
void ShowDlg(void);
但在VC6.0下會報找不到函數ShowDlg的錯誤,不知是不是我沒有設置好?
全局變量(訪問Dll文件中的全局變量)
在創建Dll的工程中,在頭文件中這樣聲明:
//lib.h
#ifndef _LIB_H
#define _LIB_H
#define _LIB_H
#ifdef DLL_FILE
extern int dllGlobalVar;
#else
extern int _declspec(dllimport) dllGlobalVar;
#endif
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
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;
{
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
}
{
return dllGlobalVar; // use the global variable
}
在調用Dll文件的工程中,需要訪問該全局變量時,聲明如下:
#include "..\\lib.h"
#pragma comment(lib,"dllTest.lib")
#pragma comment(lib,"dllTest.lib")
然後可以當作普通的全局值變量使用和修改了!
printf("%d \n", dllGlobalVar);
dllGlobalVar = 234;
printf("%d \n", dllGlobalVar);