最近也一直在搜索相关的文章,有很多不错的,比如宋宝华的《深入浅出Visual C++动态链接库编程》。那书是基于VC6的,而我用的是vs2005,因此应该是有所区别。因为是初学,也没有系统的资料,只好一点一点摸索了。
步骤如下:
因为是初学,所以需要微软的帮助,就勾上了导出符号。如下
就构成如下的文件结构。
其中Win32dllFirst.cpp文件中的部分代码引起我的注意。如下
- BOOLAPIENTRYDllMain(HMODULEhModule,
- DWORDul_reason_for_call,
- LPVOIDlpReserved
- )
- {
- switch(ul_reason_for_call)
- {
- caseDLL_PROCESS_ATTACH:
- caseDLL_THREAD_ATTACH:
- caseDLL_THREAD_DETACH:
- caseDLL_PROCESS_DETACH:
- break;
- }
- returnTRUE;
- }
还有
- //这是导出变量的一个示例
- WIN32DLLFIRST_APIintnWin32dllFirst=0;
- //这是导出函数的一个示例。
- WIN32DLLFIRST_APIintfnWin32dllFirst(void)
- {
- return42;
- }
- //这是已导出类的构造函数。
- //有关类定义的信息,请参阅Win32dllFirst.h
- CWin32dllFirst::CWin32dllFirst()
- {
- return;
- }
看来以上的代码是微软为我们预编写的一部分可以调用的。
还有下面的一段也很重要。(Win32dllFirst.h)
- #ifdefWIN32DLLFIRST_EXPORTS
- #defineWIN32DLLFIRST_API__declspec(dllexport)
- #else
- #defineWIN32DLLFIRST_API__declspec(dllimport)
- #endif
- //此类是从Win32dllFirst.dll导出的
- classWIN32DLLFIRST_APICWin32dllFirst{
- public:
- CWin32dllFirst(void);
- //TODO:在此添加您的方法。
- };
- externWIN32DLLFIRST_APIintnWin32dllFirst;
- WIN32DLLFIRST_APIintfnWin32dllFirst(void);
生成这个工程。
再在这个工程里新建一个项目。如下步骤:
再将Win21dllFirstTest设为启动项目。
照葫芦画瓢,在Win21dllFirstTest.cpp填入以下代码:
- //Win21dllFirstTest.cpp:定义控制台应用程序的入口点。
- //
- #include"stdafx.h"
- #include"windows.h"
- typedefint(CALLBACK*LPFNDLLFUNC)(void);
- int_tmain(intargc,_TCHAR*argv[])
- {
- HMODULEhDll;
- hDll=LoadLibrary("Win32dllFirst");
- LPFNDLLFUNCfnTestDLLFun;
- if(hDll!=NULL)
- {
- fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"fnWin32dllFirst");
- if(fnTestDLLFun!=NULL)
- {
- printf("%d",GetLastError());
- intresult=fnTestDLLFun();
- printf("%d",result);
- }
- else
- {
- printf("%d",GetLastError());
- printf("SSSSSSSSSSSSSSSSS");
- }
- }
- return0;
- }
编译一下会出现这个错误:
错误 1 error C2664: 'LoadLibraryW' : cannot convert parameter 1 from 'const char [8]' to 'LPCWSTR' e:/my documents/visual studio 2005/projects/win21dllfirsttest/win21dllfirsttest.cpp 10
看来是参数类型问题,就上网搜搜,前人肯定会犯和我们在一样的错误。
OK解决,将"Win32dllFirst"改为L"Win32dllFirst"(改成“LPCWSTR("Win32dllFirst")”是不行的,会出现GetLastError()返回126的错误。记得把Win32dllFirst.dll拷贝到Win21dllFirstTest根目录)。
127SSSSSSSSSSSSSSSSS请按任意键继续. . .
看来又出问题了,但是此时的问题出现在fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"fnWin32dllFirst");
ok,继续在网上爬爬。历史是轮回的,看来是"fnWin32dllFirst"这儿,即出现在生成dll时它被重命名了。
在/Common7/Tools下找到Depends.Exe,打开Win32dllFirst.dll出现:
看来就是出现重命名了。按F10,才会看到:
ok,复制?fnWin32dllFirst@@YAHXZ,将fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"fnWin32dllFirst");改成fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"?fnWin32dllFirst@@YAHXZ");去掉一些测试代码,就如下:
- //Win21dllFirstTest.cpp:定义控制台应用程序的入口点。
- //
- #include"stdafx.h"
- #include"windows.h"
- typedefint(CALLBACK*LPFNDLLFUNC)(void);
- int_tmain(intargc,_TCHAR*argv[])
- {
- HMODULEhDll;
- hDll=LoadLibrary(L"Win32dllFirst");
- LPFNDLLFUNCfnTestDLLFun;
- if(hDll!=NULL)
- {
- fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"?fnWin32dllFirst@@YAHXZ");
- if(fnTestDLLFun!=NULL)
- {
- intresult=fnTestDLLFun();
- printf("%d",result);
- }
- else
- {
- printf("%d",GetLastError());
- }
- }
- FreeLibrary(hDll);
- return0;
- }
输出42。
搞定了,睡觉,明天好好分析,里面还有很多没有懂的。