SQLGetPrivateProfileString错误地读取Unicode字符

时间:2019-04-17 07:01:20

标签: c++ c odbc

我在SQLGetPrivateProfileString中使用它来从odbcinst.ini(注册表)中读取DSN参数。

但是如果我在DSN中使用UID='König'之类的字符并调用

SQLGetPrivateProfileString(DSN, INI_USERNAME, "", temp, sizeof(temp), ODBC_INI)

变量temp='K?nig'

自然,odbc无法连接到数据源。 如何读取正确的值?

1 个答案:

答案 0 :(得分:3)

该函数的Unicode版本需要调用,即SQLGetPrivateProfileStringW。 参见this Microsoft doc

  

如果使用_UNICODE编译应用程序,请#define ODBC   头文件会将未修饰的函数调用映射到Unicode   版本。

this one

  

您可以通过以下两种方式之一将应用程序重新编译为Unicode应用程序:

     
      
  • 在应用程序的Sqlucode.h头文件中包含Unicode #define。
  •   
  • 使用编译器的Unicode选项编译应用程序。 (对于不同的编译器,此选项将有所不同。)
  •   

请参见 odbcinst.h

#ifdef  UNICODE
...
#define  SQLGetPrivateProfileString     SQLGetPrivateProfileStringW
...

其中SQLGetPrivateProfileStringW被声明为:

int  INSTAPI SQLGetPrivateProfileStringW
(
    _In_opt_ LPCWSTR lpszSection,
    _In_opt_ LPCWSTR lpszEntry,
    _In_opt_ LPCWSTR lpszDefault,
    _Out_writes_opt_(cchRetBuffer) LPWSTR lpszRetBuffer,
    int              cchRetBuffer,
    _In_opt_ LPCWSTR lpszFilename
);

该函数的Unicode版本改名为LPCWSTRLPWSTR,它们是指向16位Unicode字符的字符串的指针。任何其他函数将接收这些值的任何东西也都必须是Unicode版本。