Я пишу C ++ DLL на Visual Studio 2013. Моя DLL должна читать параметры из INI-файла. Итак, я создал функцию для этой цели (ReadConnectionSettings ()). Моя статическая переменная serverIP получает значение должным образом во время работы функции, однако, как только функция завершает выполнение переменной (serverIP) теряет свое значение. В чем проблема?
static LPTSTR serverIP = _TEXT("");
void ReadConnectionSettings()
{
TCHAR url[256];
GetPrivateProfileString(_T("Connection"), _T("Url"), _T(""), url, 256, NameOfIniFile);
serverIP = url;
}
Вы указываете указатель serverIP
в памяти стека url
,
Это выходит из области видимости при выходе из функции, поэтому ваш указатель остается указанным на мусор.
Что вы могли бы сделать, это сделать serverIP
вместо этого буфер и копия URL в него. Тогда это будет продолжаться.
То есть:
static TCHAR serverIP[256] = _TEXT("");
Затем:
_tcsnccpy(serverIP, url, 255);
Или, как предложил @DavidOtano, вы можете сохранить свой существующий указатель serverIP и использовать:
serverIP = _tcsdup(url);
Но если вы сделаете это, вы динамически распределяете память, поэтому нужно будет не забыть вызвать:
free(serverIP);
когда вам это больше не нужно, чтобы избежать утечки памяти.
Вы устанавливаете переменную статического указателя так, чтобы она указывала на локальную переменную, которая больше не существует после возврата функции.
Хороший способ вернуть строку из функции в программе Windows, это вернуть std::wstring
,
Попробуй это.
относительно LPTSTR
а также _TEXT
Это необходимо только в том случае, если вы намереваетесь поддерживать MFC в DLL в Windows 9x. Это тот случай? Если нет, просто откажитесь от этой глупости Microsoft.
Код исправлен в соответствии с приведенным выше советом (без манжеты, не тронутым руками компилятора):
auto connection_settings()
-> std::wstring
{
std::wstring url( 256, L'#' );
auto const n = GetPrivateProfileString( L"Connection", L"Url", L"", &url[0], url.size(), NameOfIniFile );
url.resize( n );
return url;
}
Хорошим свойством этого кода является то, что он больше не изменяет глобальная переменная.