GetPrivateProfileString и 64 бита

Владимир Саныч
Дата: 04.06.2015 10:36:27
Мое почтение всем. Имеется экзешник, написанный на Visual C++ образца 1998 года. В нем есть обращение к функции GetPrivateProfileString. Когда я запускаю этот экзешник под Win 7 (64 bit), это обращение возвращает "пусто". Я сам C++ почти не знаю, но в исходниках нашел вот такую вещь:

+
WINBASEAPI
DWORD
WINAPI
GetPrivateProfileStringA(
    LPCSTR lpAppName,
    LPCSTR lpKeyName,
    LPCSTR lpDefault,
    LPSTR lpReturnedString,
    DWORD nSize,
    LPCSTR lpFileName
    );
WINBASEAPI
DWORD
WINAPI
GetPrivateProfileStringW(
    LPCWSTR lpAppName,
    LPCWSTR lpKeyName,
    LPCWSTR lpDefault,
    LPWSTR lpReturnedString,
    DWORD nSize,
    LPCWSTR lpFileName
    );
#ifdef UNICODE
#define GetPrivateProfileString  GetPrivateProfileStringW
#else
#define GetPrivateProfileString  GetPrivateProfileStringA
#endif // !UNICODE

а также

+
#if !defined(_MAC) && (defined(_M_MRX000) || defined(_M_AMD64) || defined(_M_IA64)) && (_MSC_VER >= 1100) && !(defined(MIDL_PASS) || defined(RC_INVOKED))
#define POINTER_64 __ptr64
typedef unsigned __int64 POINTER_64_INT;
#if defined(_WIN64)
#define POINTER_32 __ptr32
#else
#define POINTER_32
#endif
#else
#if defined(_MAC) && defined(_MAC_INT_64)
#define POINTER_64 __ptr64
typedef unsigned __int64 POINTER_64_INT;
#else
#if (_MSC_VER >= 1300) && !(defined(MIDL_PASS) || defined(RC_INVOKED))
#define POINTER_64 __ptr64
#else
#define POINTER_64
#endif
typedef unsigned long POINTER_64_INT;
#endif
#define POINTER_32
#endif

и в другом месте
+
#if !defined(_MAC) && (defined(_M_MRX000) || defined(_M_ALPHA) || defined(_M_IA64)) && (_MSC_VER >= 1100) && !(defined(MIDL_PASS) || defined(RC_INVOKED))
#define POINTER_64 __ptr64
typedef unsigned __int64 POINTER_64_INT;
#if defined(_AXP64_)
#define POINTER_32 __ptr32
#else
#define POINTER_32
#endif
#else
#if defined(_MAC) && defined(_MAC_INT_64)
#define POINTER_64 __ptr64
typedef unsigned __int64 POINTER_64_INT;
#else
#define POINTER_64
typedef unsigned long POINTER_64_INT;
#endif
#define POINTER_32
#endif

Мне интуитивно кажется, что здесь надо что-то исправить или добавить...
MasterZiv
Дата: 04.06.2015 11:16:38
Владимир Саныч,

GetPrivateProfileString читает строку с ключём из реестра или из .ini файла.
Если в вашем ключе, отдаваемом на входе в функцию, лежит пустая строка, или ключа нет вообще, или нет .ini файла (если из него читается) то это нормально, что возврат функции будет пустой.

Так что не понятно, в чём проблема.

Прочитайте внимательно спецификацию на функцию:
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms724353(v=vs.85).aspx

и проверьте свой код вызова (которого вы сюда не предоставили).

Весь код, что вы послали, к делу не относится.
Владимир Саныч
Дата: 04.06.2015 11:31:56
Код правильный, параметры правильные, всё проверено. Я просто боюсь, что вызывается не та функция (не тот ее вариант по битности).
MasterZiv
Дата: 04.06.2015 11:59:16
Владимир Саныч,

Так давай код.

UNICODE определён в проекте ?
Владимир Саныч
Дата: 04.06.2015 12:12:00
Прошу прощения, всё заработало. У одной переменной таки было не то значение. Тысяча извинений.