SQLGetPrivateProfileString错误地读取Unicode字符

问题描述 投票:2回答:1

我在SQLGetPrivateProfileString中使用从odbcinst.ini(Registry)读取DSN参数。

但是如果我在DSN中使用像UID='König'这样的字符并打电话

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

变量temp='K?nig'

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

c++ c odbc
1个回答
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版本。

© www.soinside.com 2019 - 2024. All rights reserved.