[难题]在Unicode环境下如何调用Ansi类型的DLL 因为组里要封装一个驱动,调用了厂商提供的DLL,但此DLL是ansi类型的.而我们的调用框架是Unicode的,而且比较庞大,不易改动.请教高手指点一下怎么处理这种情况? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自己把UNICODE转为ANSI不就可以了,用函数WideCharToMultiByte 虽然现在我能够正常使用DLL中的一些功能(未完全测试完毕),但是无法释放DLL,而且不知道以后会出现什么问题.所以想得到一个妥善的解决办法. 回laiyiling(◆研究EPS文件格式◆):这个只是字符串的转换而已,主要是DLL内的hInstance,hResorceInstance,AfxGetApp()等等在调用之后全部为空,都是我自己把值传递进去的.这个搞可能要出问题,所以才求高手指点. 主要是DLL内的hInstance,hResorceInstance,AfxGetApp()等等在调用之后全部为空,都是我自己把值传递进去的.这个跟是否是UNICODE没关系,是其它原因引起的. 当然不会是unicode引起的.不理解DLL为什么要hInstance,hResorceInstance,AfxGetApp()?直接出接口不就得了 回 caferd(虽然我不帅,可惜MM爱):在DLL内部调用资源,比如弹出对话框,当hInstance,hResource为空会出断言,AfxGetApp()为空会导致无法处理消息,程序崩溃.你可以看看你的DLL里面,调用这个函数,看看返回的指针的值:AFX_MODULE_STATE* pModule = AfxGetAppModuleState();pModule->m_hCurrentInstanceHandle,pModule->m_hCurrentResourceHandle,pModule->m_pCurrentWinApp;以上这三个变量如果你把他赋为NULL,你看看会有什么效果.(这也就是我现在遇到的问题,虽然我可以赋值给他们,但无法释放DLL,以后使用中也还可能有问题出现) 回LiveALearn() ,这些东西当然不能是空的,但是这和你用unicode有什么必要联系吗?我觉得不应该是unicode的问题 叫厂商把dll弄成既支持ansi,又支持unicode,否则不买他们的东东。。 要看你的dll具体怎么被你的程序调用了,如果你要传指针到dll里,你得保证指针指向的内容是ansi的,反正只要跟dll交互的所有unicode内容转成ansi再调用dll就好了,除此之外,我想不出还有什么会引起你说的那些问题的。 Please try to use CStringW, CStringA.Hope it will help. 还有,从dll出来的东东可能都要转成unicode才能在你程序里面用。。为什么不先把unicode的开关关掉,然后调用dll试试功能能不能实现,然后再考虑unicode问题呢? 我觉得是因为你传进去的参数没有把unicode转成ansi,因为unicode里面有很多0x00,在ansi的情况下就会被认为是null。你在仔细检查一下。 回 PhShentu(Phillip Shentu):参数我做了转换,<<windows 核心编程>>讲的很清除,我看了.我现在遇到的是比如DLL中有一个函数,需要调用DLL中的资源,我如果不把AFX_MODULE_STATE* pModule = AfxGetAppModuleState();得到的模块内的成员赋值,就会崩溃.但我强行赋值后DLL无法卸载,会有内存泄漏.我该怎么办? 你用的是MFC吗?我想应该不是什么技术上的原因导致unicode App不能调用non-unicode DLL,而是一些编译、link上的原因,比如函数的名字在编译过程中会被编译器修改,但是我对MFC那块不了解,所以说不出到底什么原因引起的。 谢谢PhShentu(Phillip Shentu)的耐心回复,问题我已解决. 求指教一个几何算法怎么写。求指教! WriteFile参数的问题 关于对话框资源的问题 开发工具VC6.0 只要在界面上放置CRichEditCtrl控件,程序就运行不起来 请问在程序中如何截取一个对话框的中间部分 如何将图像转化为数据 请教:线程死循环 想在CEDIT控件里输出结果,可是总出现乱码,帮帮忙。。 Dll注入问题 送分了,http://www.csdn.net/expert/topic/109/109858.shtm 急!高难度问题,高手帮忙看看,SDI去边框问题! 难题!
所以想得到一个妥善的解决办法.
直接出接口不就得了
AFX_MODULE_STATE* pModule = AfxGetAppModuleState();pModule->m_hCurrentInstanceHandle,
pModule->m_hCurrentResourceHandle,
pModule->m_pCurrentWinApp;以上这三个变量如果你把他赋为NULL,你看看会有什么效果.(这也就是我现在遇到的问题,虽然我可以赋值给他们,但无法释放DLL,以后使用中也还可能有问题出现)
Hope it will help.
AFX_MODULE_STATE* pModule = AfxGetAppModuleState();
得到的模块内的成员赋值,就会崩溃.但我强行赋值后DLL无法卸载,会有内存泄漏.我该怎么办?