将TEXTRANGE结构的lpstrtext成员转换为MultiByteCharacterSet

时间:2016-01-26 12:19:33

标签: c++ unicode mfc textrange

我在C ++中有两个不同的项目,一个编译为静态库并使用Unicode字符编码,因为它必须支持多种语言(拼写检查器),另一个是使用MultiByteCharacterSet编码的传统MFC项目。

遗留项目必须使用库项目(以交互方式拼写检查richedit控件的内容)。

当我使用richedit控件构建一个单独的项目时,将字符编码设置为unicode并引用该库,它工作正常。但是我尝试从遗留项目中引用该库的方式与我对单独项目的方式相同,但它不起作用。

我调查并意识到由EM_GETTEXTRANGE填充的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

Visual Studio说库中的lpstrtext成员是LPWSTR(可能是因为选择了UNICODE格式),这是可以理解的。

我的问题是,有没有办法迫使lpstrtext成员期望LPSTR(强制转换),即使包含它的项目被设置为使用unicode。

1 个答案:

答案 0 :(得分:2)

TEXTRANGE是一个宏:

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

因此,您应该可以使用TEXTRANGEA来强制char*类型。