c++ mfc我想调用DLL进行二次开发,然后我在方法体内写了:HINSTANCE hdll; hdll=LoadLibrary("RFDLL.dll"
我想调用DLL进行二次开发,然后我在方法体内写了:HINSTANCEhdll;hdll=LoadLibrary("RFDLL.dll");但是感觉这代码复用性不高,其他方...
我想调用DLL进行二次开发,然后我在方法体内写了:
HINSTANCE hdll;
hdll=LoadLibrary("RFDLL.dll");
但是感觉这代码复用性不高,其他方法还是会用到的,我就把这段代码放到了方法体外,然后vc++6.0就报错了。。。其实我的意思就想知道怎么把这个实例变量弄成全局唯一的,在以后其他方法中调用直接用Getinstance()就能获取到这个唯一实例(有点像单例模式),能不能告诉我 该怎么办呢? 展开
HINSTANCE hdll;
hdll=LoadLibrary("RFDLL.dll");
但是感觉这代码复用性不高,其他方法还是会用到的,我就把这段代码放到了方法体外,然后vc++6.0就报错了。。。其实我的意思就想知道怎么把这个实例变量弄成全局唯一的,在以后其他方法中调用直接用Getinstance()就能获取到这个唯一实例(有点像单例模式),能不能告诉我 该怎么办呢? 展开
1个回答
展开全部
这个是不行的。外部的调用API只能在局部声明。
你可以自己写一个function a,返回值是HINSTANCE 然后在a中调用LoadLibrary并且返回
不久可以了么。
但是这样儿做不好的地方就是没地方free或者close这个HINSTANCE
之所以不允许全局使用我觉得应该就是出于安全考虑,如果设成全局的话,那生命周期内你怎么判断他的free或者close呢。
你可以自己写一个function a,返回值是HINSTANCE 然后在a中调用LoadLibrary并且返回
不久可以了么。
但是这样儿做不好的地方就是没地方free或者close这个HINSTANCE
之所以不允许全局使用我觉得应该就是出于安全考虑,如果设成全局的话,那生命周期内你怎么判断他的free或者close呢。
追问
哦,那也就是说我其他方法要用这个dll对象的话只能重新loadlibrary下了?那样会不会导致两者操作的对象不一致啊?
追答
也不一定,譬如,你如果有一个主函数load了,而其他需要load的地方都通过主函数调用,那么可以给调用的函数加一个参数,参数就是load的dll的句柄。
例如:
PMSIHANDLE hHandleOfRec = MsiCreateRecord(iFileNum);
CString cstrFilePath = pCAApp->GetFilePath( hHandleOfRec ,iFileNum , hHandle );
这样儿就行。
你的目的是复用性,因为你loaddll里面的函数都是一样的,
所以一般你这种目的,会把dll中的函数导出,然后用自己生命的函数包裹例如:
BOOL _DoesDirectoryExist(LPCTSTR lpszDir)
{
HANDLE hDir = ::CreateFile(lpszDir, GENERIC_ALL, FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS,
NULL);
if (hDir == INVALID_HANDLE_VALUE)
return FALSE;
CloseHandle(hDir);
return TRUE;
}
这么做是最好的方法了。
你想把load到dll的句柄弄成全局的是不行的,可以声明成全局,但是赋值必须在局部function中。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询