1

この 2 行のコードがあります。

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() が異なる時間に異なるものを返しているようです..それがどのように起こるかはわかりませんが、少なくとも私はそれを説明することができます.

4

2 に答える 2

1

GetProfileString() は、レジストリに加えて、.ini ファイルから読み取ることもできます。GetProfileString() の呼び出しが、メイン アプリケーション (たとえば dll) のオブジェクトとは異なる CWinApp 派生オブジェクトで行われた場合、アプリケーションの .ini ファイルから読み取ろうとする可能性があります。GetProfileString() にステップインして、何が起こっているかを確認してください。

ただし、私のアドバイスは次のとおりです。GetProfileString() を使用しないでください。CRegKey を使用して、レジストリを直接クエリします。レジストリ キーをあちこちに渡さなければならないのは大きな問題であるため、これはおそらく聞きたくないことでしょう。私が通常行うことは、stdafx.h でグローバル APPLICATION_REG_KEY マクロを #define することです。それは純粋主義者を動揺させますが、非常に便利です。

于 2008-12-19T14:54:35.337 に答える
0

私は答えを見つけました..ある種。AfxGetApp関数は、呼び出された場所に応じて異なるオブジェクトを返します。たとえば、dllで呼び出された場合は、そのオブジェクトへのポインターを返します。アプリがOS呼び出しを使用している場合でも、間違ったものが返されると思います。これは、GetProfileStringが別の「プロファイル」用であることを意味します。

これに遭遇した人は見つかりませんでしたが、問題は解決したと思います。そうでない場合は、「回答」を追加してください。

于 2008-12-28T01:23:19.180 に答える