Win7下VS2010创建、使用和调试DLL
————
更新于2012年8月22日 星期三
http://blog.csdn.net/shunqiziranhao007/article/details/7897772
————
建立一个空的解决方案,添加一个名为 Win32DLL 的Win32 Project的空的dll工程,再添加一个名为 UseWin32DLL 的Win32 Project的空的Windows Application工程。
我常用的做法是 工程,属性,Configuration Properties,Linker,System,SubSystem,设置为not set,这样就不需要考虑是子系统是Windows还是Console,vs会自动进行选择。
由于是在同一个解决方案中,所以两个工程的属性,Configuration Properties,Gerneral,Output Directory,都是$(SolutionDir)$(Configuration)\,这样Win32DLL工程生成的dll和UseWin32DLL工程生成的exe在同一个目录下了,这样就可以实现dll的调试了。
还有一种调试dll的方式是在Win32DLL工程的属性,Configuration Properties,Gerneral,Command中设置exe的绝对路径,我这里是,E:\ComputerScience\Debug\VS2010\Debug\UseWin32DLL.exe。
在指定位置设置断点就可以就行相应的调试了。
在Win32DLL工程添加cpp文件,添加下面的代码用来创建dll。
/* 功能,创建dll。 日期,2012年8月22日 星期三 环境,win7-32-vs2010 */ // 这是dll,所以我声明该宏,表明要导出 #define DLL_EXPORTS #ifdef DLL_EXPORTS // 被 __declspec(dllexport) 修饰,说明是要被导出的 #define DLL_API __declspec(dllexport) #else // 被 __declspec(dllimport) 修饰,说明是要被导入的 #define DLL_API __declspec(dllimport) #endif // 被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。为什么这么用可以 // 查查资料,如百度百科。 extern "C" DLL_API int add(int a, int b) { return a + b; }
在UseWin32DLL工程添加cpp文件,添加下面的代码用来测试dll。
/* 功能,使用dll。$(SolutionDir)$(Configuration)\ 日期,2012年8月222日 星期三 环境,win7-32-vs2010 */ #include <iostream> #include <Windows.h> using namespace std; typedef int(* FUN)(int , int); int main() { // 导入dlll,导入后要进行判断,看看导入是否成功,不成功就提示失败并终止 // 程序,这是一种意识。 HMODULE hDLL = LoadLibrary(L"Win32DLL.dll"); if (hDLL) { // 获取dll中的函数地址,获取后也要进行判断,为空就进行提示。 FUN pAdd = FUN(GetProcAddress(hDLL, "add")); if (pAdd) { cout << pAdd(1, 3) << endl; } else { MessageBox(NULL, L"获取add函数失败!", L"测试", MB_OK); return -1; } } else { MessageBox(NULL, L"导入dll失败!", L"测试", MB_OK); return -1; } FreeLibrary(hDLL); MessageBox(NULL, L"测试成功", L"测试", MB_OK); return 0; }
右键UseWin32DLL工程,Set as Startup Project。
build后解决方案下Debug文件夹的内容如下:
运行效果如下所示:
调试方式是,在下图所示的位置处,设置断点,然后按F5就可以进行调试了。