【解決方法】FromName() を使用した CRuntimeClass* の作成

プログラミングQA

[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]

コメント

タイトルとURLをコピーしました