У меня есть эти две строчки кода.
CString strHost = AfxGetApp()->GetProfileString(_T("WebServices"), _T("Server"));
AfxMessageBox(strHost);
Я нигде в приложении не устанавливаю значение. (это делает установщик). Таким образом, strHost должен быть одинаковым независимо от того, где и когда запускается эта строка.
Вот что у меня есть. Нажмите A -> запустить функцию, содержащую код -> увидеть ожидаемые данные; Нажмите B -> выполните обратные вызовы Windows -> запустите функцию, содержащую код -> см. "";
Я бы подумал, что что-то в B очищает значение, но если я сначала нажму B, а затем A, A выдаст то, что я хочу, а не "".
К сожалению, у меня нет доступа к коду, который содержит обратные вызовы Windows, или, скорее, это должна быть самая большая куча плохо управляемой обфискации, которую я когда-либо видел.
Что меня любопытно, так это то, что GetProfileString извлекает данные откуда-то, чего не должно быть? Это единственное, о чем я могу думать.
Вопросов.
1.) Есть ли способ подтвердить, что я все еще работаю с тем же "ключом"?
2.) Кто-нибудь сталкивался с этим раньше?
Пожалуйста, если вы считаете, что это плохой вопрос, и хотите отметить его как таковой, оставьте комментарий, чтобы я мог его исправить.
Хотя я не нашел полного ответа, я нашел кое-что интересное.
Я использую AfxGetApp () -> GetProfileString ..
Кажется, функция AfxGetApp () возвращает разные вещи в разное время .. Я не уверен, как это могло произойти, но, по крайней мере, теперь я могу это объяснить.





GetProfileString () может также читать из файла .ini, помимо реестра. Если вызов GetProfileString () выполняется для объекта, производного от CWinApp, отличного от объекта в основном приложении (например, в dll), он может попытаться прочитать из файла .ini приложения. Попробуйте войти в GetProfileString (), чтобы узнать, что происходит.
Однако мой совет: не используйте GetProfileString (). Используйте CRegKey для прямого запроса реестра. Вероятно, это не то, что вы хотите услышать, потому что очень важно передавать ключ реестра. Обычно я # определяю глобальный макрос APPLICATION_REG_KEY в stdafx.h. Пуристов это расстраивает, но очень удобно.
К сожалению, я не могу войти в код. Это приложение PPC, и проблема возникает только на одном типе устройства, когда пользователь проводит кредитную карту. Я думаю, что ты прав. Проблема в том, как это исправить.
Да ладно, в таком случае я сочувствую тебе, потому что не вижу другого выхода. Возможно, попробуйте с помощью такого инструмента, как RegMon, чтобы узнать, осуществляется ли какой-либо доступ к реестру в вашем сценарии Press B. Не уверен, насколько это возможно в вашей среде.
это не так .. Но я думаю, что ваше представление о DLL влияет, может выдержать критику ... Я помещаю блоки afxmessage в dll, чтобы посмотреть, что может происходить.
Я нашел ответ .. Вроде. Функция AfxGetApp возвращает разные объекты в зависимости от того, где она вызывается. Если она вызывается, например, в dll, она возвращает указатель на нее. Я думаю, что он даже возвращает не то, что приложение использует вызовы ОС. Это означает, что GetProfileString предназначена для другого «профиля».
Я не нашел никого, кто сталкивался с этим, но считаю, что проблема решена. Не стесняйтесь добавлять больше «ответов», если вы этого не сделаете ..
У меня был аналогичный случай с AfxGetApp в DLL. Я обнаружил, что в этом случае методы Get / Set работают с файлом .ini в c: \ windows, сформированном из имени DLL.
Это то, что я думал, что мне, возможно, придется сделать. Проблема в том, что приложение запуталось. (Я унаследовал это от парня, которого уволили), и строка профиля get and set используется повсюду. Я бы хотел заменить его везде, и это означало бы полный регрессионный тест ... Фу ... Но спасибо.