我要用到一个开源包(GeoPad),开发环境为EVC+PPC2003模拟器,所给开发包SDK中包括了3个DLL(GeoPAD.DLL,GeoPADVB.NET.DLL,和GeoPADVC.NET.DLL)和一个.h文件(定义了一个类GeoPADCtrl),还分别给了C#和c++版的2个例程。
C#版的例程将GeoPADVB.NET.DLL加入引用,并将3个DLL都放至EXE目录下,语句 GeoPADVB.NET.GeoPADCtrl geo = new GeoPADVB.NET.GeoPADCtrl()得到一个封装在DLL中类GeoPADCtrl的实例,通过操作该实例能实现所需功能。我用DLL查看工具查看——GeoPAD.DLL和GeoPADVC.NET.DLL中都一系列函数,而GeoPADVB.NET.DLL中没有函数,不明白这三个DLL是如何将类GeoPADCtrl封装起来的(必须3个DLL一起使用才能实现功能) 。
现在问题来了,我要用C++实现,SDK中指明C++实现只需用到GeoPAD.DLL和定义了GeoPADCtrl类的.h文件,所给的C++版例程中是将该.h头文件加入到工程中,GeoPADCtrl类构造函数中初始化成员变量HINSTANCE hInstasnce = LoadLibrary(TEXT("\\windows\\GeoPAD.dll"))
而其成员函数形式为:
bool DoSome(char *Parameter)
{
bool (PASCAL *funDoSome)(char *Parameter);
(FARPROC&)funDoSome= GetProcAddress(hInstasnce,_T("funNameInDll"));
if(funDoSome)
return funDoSome(Parameter);
return false;
}
现在生成类GeoPADCtrl对象时 hInstasnce = LoadLibrary(TEXT("\\windows\\GeoPAD.dll"))这句总返回为NULL,路径保证正确。
而改为hInstasnce = LoadLibrary(TEXT("\\windows\\GeoPADVB.NET.dll"))则抛出First-chance exception in XXX.exe: 0xC0000005异常,C++实现只需要导入DLL中的函数而不是整个类,我认为导入GeoPAD.dll就可以了。主要是不明白这3个DLL是如何将GeoPADCtrl类封装起来的,而单独导出类中的函数是不是有什么地址偏移什么的?我是猜测的,望大家指导下。
用depends.exe查看GeoPADVB.NET.DLL无错误提示,在CPU类型栏显示为X86。
而用depends.exe查看GeoPAD.DLL则提示:
Error: At least one required implicit or forwarded dependency was not found.
Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module.
Error: Modules with different CPU types were found
CPU类型栏显示为ARM。
想请教下大家:
1:C#版代码能实现功能而C++版LoadLibrary失败可能是由于什么原因造成?A:因为DLL的CPU类型不同 B:因为导出整个DLL封装类和单独导出类函数的差异
2:如果C++实现我也想将整个类导出来该如何实现?用Lib+.h的方式?