[ad_1]
良い一日、
以下のように、クラス名 CMyClass の文字列を使用して CRuntimeClass ポインターを作成しようとしています
C#
CRuntimeClass * pClass = CRuntimeClass::FromName(L"CMyClass");
CMyClass は、基本クラス CRecordView を使用して DYNCREATE としてすでに宣言されています。
すべての労力を費やしても、特定のポインタは NULL として返されます。
デバッグ中に、次のコードにあることに気付きました。
引用
C#
CRuntimeClass* PASCAL CRuntimeClass::FromName(LPCSTR lpszClassName) { CRuntimeClass* pClass=NULL; ENSURE(lpszClassName); // search app specific classes AFX_MODULE_STATE* pModuleState = AfxGetModuleState(); AfxLockGlobals(CRIT_RUNTIMECLASSLIST); for (pClass = pModuleState->m_classList; pClass != NULL; pClass = pClass->m_pNextClass) { if (lstrcmpA(lpszClassName, pClass->m_lpszClassName) == 0) { AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST); return pClass; } }
引用を解除する
変数 m_classList には CMyClass が含まれていません。
ご協力をよろしくお願いいたします。
解決策 1
ASCII を必要とする関数に Unicode 文字列を渡しています。 定数を変更するか、アプリケーションを Unicode 用に再構築してください。
解決策 2
DECLARE_DYCREATE だけでは十分ではありません。 DECLARE_SERIAL が必要です
その後初めて、クラスが ModuleState->m_classList に追加されます。
[ad_2]
コメント