主项目和dll项目字符集不同,造成的有关问题
主项目和dll项目字符集不同,造成的问题
环境: win7+vs05
问题描述:
1,创建一个dlgTest项目;
2,在该dlgTest解决方案内添加一个win32 DLL项目DllTest; CDlltest : public CWnd
3,DllTest项目中添加一个函数:
void Create()
4, 在dlgTest项目中加载dll项目的 .lib, .h .dll
5, dlgTest类中加入一个DllTest m_dt变量;
6, 在dlgTest中添加一个按钮, 按钮内代码: m_dt.Create();
问题就在这里:
1,当主项目为unicode,dll项目为unicode时 运行成功;
2,当主项目为unicode,dll项目为多字节时,运行出现错误!
3,当主项目为多字节,dll项目为unicode时 运行出现错误!
4,当主项目为多字节,dll项目为多字节时,运行成功!
错误内容:
断点位置:
------解决思路----------------------
2个方案
1,必须生成两个dll库,不同的字符集使用对应的dll版本
2,调用之前将字符串转换为对应的dll适合的字符串格式
------解决思路----------------------
可以象WinApi 一样 实现和导出两种版本函数 xxxFunA xxxxFunW
#if (defined _UNICODE
------解决思路----------------------
defined UNICODE)
#define xxxFun xxxFunW
#else
#define xxxFun xxxFunA
#endif
环境: win7+vs05
问题描述:
1,创建一个dlgTest项目;
2,在该dlgTest解决方案内添加一个win32 DLL项目DllTest; CDlltest : public CWnd
3,DllTest项目中添加一个函数:
void Create()
void CDlltest::Create()
{
if (!::IsWindow(this->m_hWnd))
{
CWnd* pParentWnd = CWnd::GetDesktopWindow();
this->CWnd::Create(NULL, _T("testdll_msg"),WS_CHILD, CRect(0,0,20,20),pParentWnd,0);
if (!::IsWindow(this->m_hWnd))
{
TRACE("Creat CMyLaserRadar Window Failed!\n");
ASSERT(FALSE);
return ;
}
}
}
4, 在dlgTest项目中加载dll项目的 .lib, .h .dll
5, dlgTest类中加入一个DllTest m_dt变量;
6, 在dlgTest中添加一个按钮, 按钮内代码: m_dt.Create();
问题就在这里:
1,当主项目为unicode,dll项目为unicode时 运行成功;
2,当主项目为unicode,dll项目为多字节时,运行出现错误!
3,当主项目为多字节,dll项目为unicode时 运行出现错误!
4,当主项目为多字节,dll项目为多字节时,运行成功!
错误内容:
断点位置:
_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetInstanceHandle()
{ ASSERT(afxCurrentInstanceHandle != NULL);
return afxCurrentInstanceHandle; }
------解决思路----------------------
2个方案
1,必须生成两个dll库,不同的字符集使用对应的dll版本
2,调用之前将字符串转换为对应的dll适合的字符串格式
------解决思路----------------------
可以象WinApi 一样 实现和导出两种版本函数 xxxFunA xxxxFunW
#if (defined _UNICODE
------解决思路----------------------
defined UNICODE)
#define xxxFun xxxFunW
#else
#define xxxFun xxxFunA
#endif