C++ 转换文本范围结构';s lpstrtext成员到多字节字符集

C++ 转换文本范围结构';s lpstrtext成员到多字节字符集,c++,unicode,mfc,textrange,C++,Unicode,Mfc,Textrange,我在C++中有两个不同的项目,一个编译成一个静态库,使用Unicode字符编码,它支持多语言(拼写检查),另一个是使用多字节字符集编码的传统MFC项目。 遗留项目必须使用库项目(以交互方式拼写检查richedit控件的内容) 当我使用richedit控件构建一个单独的项目时,将字符编码设置为unicode并引用库,它可以正常工作。但是,如果我试图以与单独项目相同的方式引用遗留项目中的库,那么它就不起作用了 我调查并意识到,由EM_getextrange填充的TEXTRANGE结构期望其lpstr

我在C++中有两个不同的项目,一个编译成一个静态库,使用Unicode字符编码,它支持多语言(拼写检查),另一个是使用多字节字符集编码的传统MFC项目。 遗留项目必须使用库项目(以交互方式拼写检查richedit控件的内容)

当我使用richedit控件构建一个单独的项目时,将字符编码设置为unicode并引用库,它可以正常工作。但是,如果我试图以与单独项目相同的方式引用遗留项目中的库,那么它就不起作用了

我调查并意识到,由EM_getextrange填充的TEXTRANGE结构期望其lpstrtext成员中有一个Unicode值,而对于遗留项目则不是这样。图书馆的实施情况如下:

TEXTRANGE txtRange;
  memset (&txtRange, 0, sizeof(txtRange));
  memset (bufW, 0, sizeof (bufW));
  //debug_log("Size of TEXTRANGE: x: %d and Size of BufW: %d.", sizeof(txtRange), sizeof(bufW));
  txtRange.lpstrText  = string_from_unicode_cp(bufW, CP_ACP);
  txtRange.chrg.cpMin = 0;
  txtRange.chrg.cpMax = _countof(bufW);
  debug_log("count of bufw: %s.", bufW);
  SendMessage (hwnd, EM_GETTEXTRANGE, 0, (LPARAM)&txtRange);
  debug_log("txtRange.lpstrText is: %S",txtRange.lpstrText);
但我得到了一个错误:

SpellChecker.cpp(215): error C2440: '=' : cannot convert from 'char *' to 'LPWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
VisualStudio说库中的lpstrtext成员是LPWSTR(可能是因为选择了UNICODE格式),这是可以理解的


我的问题是,有没有一种方法可以强制lpstrtext成员期望LPSTR(cast),即使包含它的项目设置为使用unicode。

TEXTRANGE
是一个宏:

#ifdef UNICODE
#define TEXTRANGE   TEXTRANGEW
#else
#define TEXTRANGE   TEXTRANGEA
#endif // UNICODE 

因此,您应该能够使用
TEXTRANGEA
而不是强制键入
char*

您可能需要该函数。谢谢@Vlad,您的回答回答回答了我的问题,但不幸的是没有解决我的问题。那么,您可能应该问另一个问题:)无论如何,大多数Microsoft API函数都是基于_UNICODE设置定义的宏。这使得很难将UNICODE与MBCS混合使用。但是如果必须的话,你的库应该清楚地公开每个函数的两个版本,由它的客户端显式调用。谢谢@Vlad,你的回答回答了我的问题,但不幸的是没有解决我的问题。换句话说,有没有一种方法可以在MBCS编码的MFC应用程序中创建Richedit控件,但是Richedit应该是Unicode编码的(或者一种方法可以将MFC Richedit HWND的字符编码从MBCS转换为Unicode,而不改变整个项目的编码格式)。我正在尝试理解API。似乎您将CRichEdit控件窗口的句柄传递给拼写检查库,然后它通过SendMessage()与该窗口通信-对吗?该库假定富编辑是UNICODE的,因此要正确使用该库,需要将控件创建为UNICODE。您只是没有机会进行MBCS到UNICODE的转换,因为该对话并不涉及您,而是涉及到了。你可以在MBCS应用程序中使用UNICODE控件,但你必须重新设计旧应用程序的内部结构,我认为这是不好的。正是Vlad,这正是正在发生的事情,也正是我试图做的事情(你是一个英雄)。。我现在找到了一个临时解决办法。但我希望我不会很快支持任何广泛的字符特定语言。。我会根据我的研究结果更新这篇文章。我会投票支持你的回答,但是stackoverflow说我不能投票,直到我获得15的声誉,但是非常感谢你的回答真的帮助了我。