VC6.0下调用Dll文件提供的函数接口和全局变量(转)

函数接口

      首先把生成的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);
修改会影响本工程使用的值,不过内部实现的原理还不清楚:(
 据说还有一种方法可以访问全局变量的指针形式,不过我一直没有试通,希望高人指点!)

你可能感兴趣的:(C++)