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()就能获取到这个唯一实例(有点像单例模式),能不能告诉我 该怎么办呢?
展开
 我来答
百度网友5722492f7
2013-04-16 · TA获得超过725个赞
知道小有建树答主
回答量:594
采纳率:0%
帮助的人:476万
展开全部
这个是不行的。外部的调用API只能在局部声明。
你可以自己写一个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中。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式