因为组里要封装一个驱动,调用了厂商提供的DLL,但此DLL是ansi类型的.
而我们的调用框架是Unicode的,而且比较庞大,不易改动.
请教高手指点一下怎么处理这种情况?

解决方案 »

  1.   

    自己把UNICODE转为ANSI不就可以了,用函数WideCharToMultiByte
      

  2.   

    虽然现在我能够正常使用DLL中的一些功能(未完全测试完毕),但是无法释放DLL,而且不知道以后会出现什么问题.
    所以想得到一个妥善的解决办法.
      

  3.   

    回laiyiling(◆研究EPS文件格式◆):这个只是字符串的转换而已,主要是DLL内的hInstance,hResorceInstance,AfxGetApp()等等在调用之后全部为空,都是我自己把值传递进去的.这个搞可能要出问题,所以才求高手指点.
      

  4.   

    主要是DLL内的hInstance,hResorceInstance,AfxGetApp()等等在调用之后全部为空,都是我自己把值传递进去的.这个跟是否是UNICODE没关系,是其它原因引起的.
      

  5.   

    当然不会是unicode引起的.不理解DLL为什么要hInstance,hResorceInstance,AfxGetApp()?
    直接出接口不就得了
      

  6.   

    回 caferd(虽然我不帅,可惜MM爱):在DLL内部调用资源,比如弹出对话框,当hInstance,hResource为空会出断言,AfxGetApp()为空会导致无法处理消息,程序崩溃.你可以看看你的DLL里面,调用这个函数,看看返回的指针的值:
    AFX_MODULE_STATE* pModule = AfxGetAppModuleState();pModule->m_hCurrentInstanceHandle,
    pModule->m_hCurrentResourceHandle,
    pModule->m_pCurrentWinApp;以上这三个变量如果你把他赋为NULL,你看看会有什么效果.(这也就是我现在遇到的问题,虽然我可以赋值给他们,但无法释放DLL,以后使用中也还可能有问题出现)
      

  7.   

    回LiveALearn() ,这些东西当然不能是空的,但是这和你用unicode有什么必要联系吗?我觉得不应该是unicode的问题
      

  8.   

    叫厂商把dll弄成既支持ansi,又支持unicode,否则不买他们的东东。。
      

  9.   

    要看你的dll具体怎么被你的程序调用了,如果你要传指针到dll里,你得保证指针指向的内容是ansi的,反正只要跟dll交互的所有unicode内容转成ansi再调用dll就好了,除此之外,我想不出还有什么会引起你说的那些问题的。
      

  10.   

    Please try to use CStringW, CStringA.
    Hope it will help.
      

  11.   

    还有,从dll出来的东东可能都要转成unicode才能在你程序里面用。。为什么不先把unicode的开关关掉,然后调用dll试试功能能不能实现,然后再考虑unicode问题呢?
      

  12.   

    我觉得是因为你传进去的参数没有把unicode转成ansi,因为unicode里面有很多0x00,在ansi的情况下就会被认为是null。你在仔细检查一下。
      

  13.   

    回 PhShentu(Phillip Shentu):参数我做了转换,<<windows 核心编程>>讲的很清除,我看了.我现在遇到的是比如DLL中有一个函数,需要调用DLL中的资源,我如果不把
    AFX_MODULE_STATE* pModule = AfxGetAppModuleState();
    得到的模块内的成员赋值,就会崩溃.但我强行赋值后DLL无法卸载,会有内存泄漏.我该怎么办?
      

  14.   

    你用的是MFC吗?我想应该不是什么技术上的原因导致unicode App不能调用non-unicode DLL,而是一些编译、link上的原因,比如函数的名字在编译过程中会被编译器修改,但是我对MFC那块不了解,所以说不出到底什么原因引起的。
      

  15.   

    谢谢PhShentu(Phillip Shentu)的耐心回复,问题我已解决.