我MBCS编码的.exe调用unicode的.dll,但发现cstring没有办法转过来。
具体:
---------.dll中--------
//---a.h
class A //当然要加dll调用的dllexport等等,在这儿我省略了。
{
public:
TCHAR TcharVar[1024];
CString CStringVar;
void fun();
}//---a.cpp
void A:fun()
{
swprintf(TcharVar, 1024, L"abc");
CStringVar.Format(L"%s",L"abc");
}//---------------.exe------------------------
在工程中调用了a.h和.lib和.dll,
void main()
{
A Aer;
Aer.fun();
}发现TcharVar在dll的fun中为wchat的类型:
TcharVar[0] = a;
TcharVar[1] = b;
TcharVar[2] = c;
在.exe中为char的类型:
TcharVar[0] = a;
TcharVar[1] = 0;
TcharVar[2] = b;
TcharVar[3] = 0;
TcharVar[4] = c;
TcharVar[5] = 0;
然后我在.exe中把偶数位去掉,转换为
TcharVar[0] = a;
TcharVar[1] = b;
TcharVar[2] = c;
得到正确的TcharVar,
但问题是现在CStringVar这个变量没法通过类似的转换,因为在.exe里它就变成了a,后面的东西就丢掉了,请问怎么弄出CStringVar的值?
p.s. 我的dll中用到了很多的CString变量,所以把它一个个改成TCHAR不可能,只能在.exe里转换,多谢。

解决方案 »

  1.   

    不同转换,打开VS工程设置里的使用unicode字符集,CString自己就是unicode
      

  2.   

    如果不同模块使用的编码不同,最好用指定编码的字符串类型,比如你调用UNICODE编码的dll,就用wchar_t和LPWSTR、LPCWSTR等类型;另外不要跨模板直接传递对象,可以传递指针或者转换为指针,比如返回字符串的函数不要返回CString或者CString&等,而返回LPCTSTR。
      

  3.   

    一般最好不要用CString做参数,这样很容易有问题,LPCTSTR是个不错的选择。在exe中把宽字节转成ANSI字符串就好了呀,用WideCharToMultiByte或者W2A这个宏
      

  4.   

    如果是我自己编的程序我是尽量避免CString的
    但现在的问题是别人的.dll已经用了很多的CString了,怎么才能对CString来做转换呢?
      

  5.   

    强制用CStringW,然后自己转换啊。