首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

DLL之——三角恋解决思路

2012-04-10 
DLL之——三角恋我要用到一个开源包(GeoPad),SDK中包括了3个DLL(GeoPAD.DLL,GeoPADVB.NET.DLL,和GeoPADVC.NE

DLL之——三角恋
我要用到一个开源包(GeoPad),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封装起来的。
现在问题来了,我要用C++实现,SDK中指明C++实现只需用到GeoPAD.DLL和定义了GeoPADCtrl类的.h文件,所给的C++版例程中是将该.h头文件加入到工程中,GeoPADCtrl类构造函数中初始化成员变量HINSTANCE hInstasnce = LoadLibrary(TEXT("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("GeoPAD.dll"))这句总返回为NULL,路径保证正确。
而改为hInstasnce = LoadLibrary(TEXT("GeoPADVB.NET.dll"))则抛出First-chance exception in XXX.exe: 0xC0000005异常,C++实现只需要导入DLL中的函数而不是整个类,我认为导入GeoPAD.dll就可以了。主要是不明白这3个DLL是如何将GeoPADCtrl类封装起来的,而单独导出类中的函数是不是有什么地址偏移什么的?我是猜测的,望大家指导下。

还有 如果C++实现我也想将整个类导出来该如何实现?用Lib+.h的方式?但是我没有Lib文件,用regsvr32命令生成LIB提示:GeoPAD.DLL不是一个可执行文件,没有为这个文件类型注册的注册程序。


[解决办法]
友情up!
[解决办法]
hInstasnce = LoadLibrary(TEXT("GeoPAD.dll"))这句总返回为NULL
可以输入绝对路径试一试,如果是同一目录下最好这样LoadLibrary(TEXT(".\\GeoPAD.dll"))

而改为hInstasnce = LoadLibrary(TEXT("GeoPADVB.NET.dll"))则抛出First-chance exception in XXX.exe: 0xC0000005异常
VC是不能使用C#的写的DLL.

用regsvr32命令生成LIB
regsvr32只会注册,不会生成LIB

自我感觉问题还是在hInstasnce = LoadLibrary(TEXT("GeoPAD.dll"))这一句,可以用GetLastError()查一下返回错误.


[解决办法]
regsvr32是注册com组件的。一般dll不必这样。

加载动态库失败,多半是路径问题,或者动态库本身用到的其他动态库找不到。
[解决办法]
GeoPAD.DLL的运行环境有问题,在dllmain中运行时找来到支持它的组件而失败.建议看一下sdk的祥细说明,系统中都需要哪些组件.

热点排行