转自
http://www.cnblogs.com/yumn2004/archive/2010/03/30/1700550.html
Visual Studio 2005下创建智能设备的非MFC的Dll,打开“新建”项目后不会像EVC++一样出现“Win32 Dynamic-Link Library”的选项,
它将智能设备的dll选项整合到“Win32智能设备项目”中,如下图所示:
命名好项目工程名“DllTest3”后确定。接下来是智能设备项目向导,简要概括之后要选择项目所依赖的SDK,这其中Pocket PC 2003和
Smartphone 2003支持ARMV4指令集,而Windows Mobile 5.0 Pocket PC SDK和Windows Mobile 6 Professional支持ARMV4I
指令集,本测试中选择目前常用的后者。
选择Dll所支持的SDK以后,即开始项目设置,本实例选择“Dll ”并附加“空项目”选项,如下图:
完成后得到一个空的dll工程,分别给工程添加DllTest3.h和DllTest3.cpp文件:
分别向两文件DllTest3.h和DllTest3.cpp添加如下内容:
1 // DllTest3.h 文件内容
2 //
3 #ifndef DLL_TEST2_H_
4 #define DLL_TEST2_H_
5
6 //定义导出函数
7 extern "C" __declspec(dllexport) int add(int x,int y);
8 #endif
1 // DllTest2.cpp : 定义 DLL 应用程序的入口点及导出函数
2 //
3 #include <windows.h>
4 #include <commctrl.h>
5
6 #include "DllTest3.h"
7
8
9 BOOL APIENTRY DllMain( HANDLE hModule,
10 DWORD ul_reason_for_call,
11 LPVOID lpReserved
12 )
13 {
14 return TRUE;
15 }
16
17 // ============================================================
18 //函数实体
19 int add(int x,int y)
20 {
21 return x+ y;
22 }
上述代码编写完成后,选择如下图所示的SDK进行编译:
这时候看看工程目录下是不是得到了编译结果?是的。在我们的“../DllTest3/Windows Mobile 6 Professional SDK (ARMV4I)/Debug”
目录下,可以看到非常熟悉、亲切的DllTest3.lib和DllTest3.dll文件了。
//============================================================================
接下来,是如何把我们得到的dll在模拟器或设备上进行测试。首先,在上述解决方案内新建名为CallDllTest3的工程,同样会有“项目概述”、
“平台SDK选择”和“应用程序设置”三个步骤,期中前两个步骤与新建dll时的设置完全相同,第三个步骤设置如下:
在CallDllTest3工程的CallDllTest3.cpp文件中添加如下引用dll的语句(这里采用静态引用的方法,另外还有动态调用的方法,朋友们可以参
考宋宝华的《VC++动态链接库(DLL)编程深入浅出》一文):
1 #include "..//DllTest3//DllTest3.h"
2 #pragma comment(lib,"..//DllTest3//Windows Mobile 6 Professional SDK (ARMV4I)//Debug//DllTest3.lib")
在CallDllTest3.cpp文件的WinMain函数中添加如下测试语句
1 MessageBeep(0); //测试系统api函数
2 int sum = 0 ;
3 sum = add(1,0); //调用dll中的函数,本实例中采用静态链接的方式
4 if (sum == 1) //函数调用成功
5 {
6 MessageBoxW(NULL,_T("测试智能设备Dll成功。"),_T("Yu Minglang" ),sum);
7 }
8 else //函数调用不成功
9 {
10 MessageBoxW(NULL,_T("测试智能设备Dll未成功。"),_T("Yu Minglang"),0 );
11 }
将CallDllTest3工程设置为启动工程,选择“Windows Mobile 6 Professional SDK (ARMV4I)”进行编译,出现如下警告:
“ 1 warning LNK4099: 未找到 PDB“libbmtd.pdb”(使用“D:/Program Files/Microsoft Visual Studio 8/VC/ce/lib/ARMV4I/LIBCMTD.lib”
或在“e:/CPP2005/DllTest3/CallDllTest3/Windows Mobile 6 Professional SDK (ARMV4I)/Debug/libbmtd.pdb”中寻找);正在链接对象,
如同没有调试信息一样 LIBCMTD.lib ”
上述敬告是因为安装了VS2005 sp1所致,此警告可忽略,或参看msdn。
将上述程序在CHS Windows Mobile 6 Professional Emulator中运行程序,出现下面的错误:
朋友们可千万别按系统提示的方法做,原因是刚刚编译好的dll这时候还在本地电脑上,并没有拷贝到模拟器或设备的program files文件夹下的CallDllTest3
目录中。我们把一开始编译得到的DllTest3.lib和DllTest3.dll拷贝到“/Program Files/CallDllTest3”中(要这样做,可别忘了要事先同步模拟器或设备)。
最后,再次运行,得到结果:
经验证在设备中(我的是多普达P860)也能测试成功!