最近也一直在搜索相关的文章,有很多不错的,比如宋宝华的《深入浅出Visual C++动态链接库编程》。那书是基于VC6的,而我用的是vs2005,因此应该是有所区别。因为是初学,也没有系统的资料,只好一点一点摸索了。
步骤如下:
因为是初学,所以需要微软的帮助,就勾上了导出符号。如下
就构成如下的文件结构。
其中Win32dllFirst.cpp文件中的部分代码引起我的注意。如下
- BOOL APIENTRY DllMain( HMODULE 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;
- }
还有
- // 这是导出变量的一个示例
- WIN32DLLFIRST_API int nWin32dllFirst=0;
- // 这是导出函数的一个示例。
- WIN32DLLFIRST_API int fnWin32dllFirst(void)
- {
- return 42;
- }
- // 这是已导出类的构造函数。
- // 有关类定义的信息,请参阅 Win32dllFirst.h
- CWin32dllFirst::CWin32dllFirst()
- {
- return;
- }
看来以上的代码是微软为我们预编写的一部分可以调用的。
还有下面的一段也很重要。(Win32dllFirst.h)
- #ifdef WIN32DLLFIRST_EXPORTS
- #define WIN32DLLFIRST_API __declspec(dllexport)
- #else
- #define WIN32DLLFIRST_API __declspec(dllimport)
- #endif
- // 此类是从 Win32dllFirst.dll 导出的
- class WIN32DLLFIRST_API CWin32dllFirst {
- public:
- CWin32dllFirst(void);
- // TODO: 在此添加您的方法。
- };
- extern WIN32DLLFIRST_API int nWin32dllFirst;
- WIN32DLLFIRST_API int fnWin32dllFirst(void);
生成这个工程。
再在这个工程里新建一个项目。如下步骤:
再将Win21dllFirstTest设为启动项目。
照葫芦画瓢,在Win21dllFirstTest.cpp填入以下代码:
- // Win21dllFirstTest.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include "windows.h"
- typedef int (CALLBACK* LPFNDLLFUNC)(void);
- int _tmain(int argc, _TCHAR* argv[])
- {
- HMODULE hDll;
- hDll=LoadLibrary("Win32dllFirst");
- LPFNDLLFUNC fnTestDLLFun;
- if(hDll!=NULL)
- {
- fnTestDLLFun = (LPFNDLLFUNC)GetProcAddress(hDll,"fnWin32dllFirst");
- if(fnTestDLLFun!=NULL)
- {
- printf("%d",GetLastError());
- int result=fnTestDLLFun();
- printf("%d",result);
- }
- else
- {
- printf("%d",GetLastError());
- printf("SSSSSSSSSSSSSSSSS");
- }
- }
- return 0;
- }
编译一下会出现这个错误:
错误 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"
- typedef int (CALLBACK* LPFNDLLFUNC)(void);
- int _tmain(int argc, _TCHAR* argv[])
- {
- HMODULE hDll;
- hDll=LoadLibrary(L"Win32dllFirst");
- LPFNDLLFUNC fnTestDLLFun;
- if(hDll!=NULL)
- {
- fnTestDLLFun = (LPFNDLLFUNC)GetProcAddress(hDll,"?fnWin32dllFirst@@YAHXZ");
- if(fnTestDLLFun!=NULL)
- {
- int result=fnTestDLLFun();
- printf("%d",result);
- }
- else
- {
- printf("%d",GetLastError());
- }
- }
- FreeLibrary(hDll);
- return 0;
- }
输出42。
转载:http://blog.csdn.net/breaksoftware/article/details/3623847
代码下载:http://download.csdn.net/detail/jiayou8809/6618065
深入浅出Visual C++动态链接库(Dll)编程 http://soft.yesky.com/lesson/318/2166818.shtml?412