2009-04-04 14 views
3

これはRegister implementation of a com interfaceの続きです。今ではデバッグが必要な実際のコードがあります。壊れたCOMオブジェクト登録

私は2つのCOMオブジェクトを持っています.1つはIAudioSessionEventsを実装し、もう1つはIClassFactoryを実装して最初のオブジェクトを生成します。

次のコードは、(COM登録の私の理解に基づいて)これらのオブジェクトを登録します。

BOOL RegisterClassManually(WCHAR* szGuid, WCHAR* szDllPath) 
{ 
WCHAR szKeyName[1024]; 
wsprintf(szKeyName, TEXT("Software\\Classes\\CLSID\\%s"), szGuid); 

if(!RegisterKeyValue(HKEY_CURRENT_USER, szKeyName, NULL, TEXT(DESCRIPTION_CONST))) return false; 

wsprintf(szKeyName, TEXT("Software\\Classes\\CLSID\\%s\\InprocServer32"), szGuid); 

if(!RegisterKeyValue(HKEY_CURRENT_USER, szKeyName, NULL, szDllPath)) return false; 
if(!RegisterKeyValue(HKEY_CURRENT_USER, szKeyName, TEXT("ThreadingModel"), TEXT("Apartment"))) return false; 

return true; 
} 

STDAPI DllRegisterServer() 
{ 
//Write data to HKEY_CURRENT_USER\\Software\\Classes\\CLSID\\{GUID} 
// Also ""\\InProcServer32 
// Also "".ThreadingModel = "Apartment" 

WCHAR* szGuid; 
WCHAR szDllPath[512]; 
StringFromCLSID(CLSID_AudioEventsFactory, &szGuid); 

if(g_dllModule == NULL) return SELFREG_E_CLASS; 

GetModuleFileName(g_dllModule, szDllPath, 512); 

if(!RegisterClassManually(szGuid, szDllPath)) return SELFREG_E_CLASS; 

StringFromCLSID(CLSID_AudioEvents, &szGuid); 

if(!RegisterClassManually(szGuid, szDllPath)) return SELFREG_E_CLASS; 

return S_OK; 
} 

私はRegisterKeyValue(...)、私のように作品を確認しましたシンプルなレジストリコードを省略しました意図されました。

このコードは、これらのCOMオブジェクトを使用しようとする:

IAudioSessionEvents* listener = NULL; 

IClassFactory* factory = NULL; 

//Fails on this call 
hr = CoGetClassObject(CLSID_AudioEventsFactory, CLSCTX_ALL, NULL, __uuidof(IClassFactory), (void**)&factory); 

if(hr != S_OK) 
{ 
    ... Report Error ... 
} 

hr = factory->CreateInstance(NULL, __uuidof(IAudioSessionEvents), (void**)&listener); 

CoGetClassObjectに(...)への呼び出しは(のClassFactoryが要求されたクラスを提供することができない)のHR =の0x80040111を返します。いるDllGetClassObject(ommisionを指摘1800年あたりINFORMATION)の

実装:私はここで何が問題を

STDAPI DllGetClassObject(const CLSID& clsid, 
        const IID& iid, 
        void** ppv) 
{ 

if (clsid == __uuidof(IClassFactory)) 
{ 
    AudioEventsFactory *pFact = new AudioEventsFactory; 
    if (pFact == NULL) 
     return E_OUTOFMEMORY; 
    else 
    { 
     return pFact->QueryInterface(iid , ppv); 
    } 
} 

return CLASS_E_CLASSNOTAVAILABLE; 
} 

をやっていますか?私はCOM登録でそれが疑わしいですが、実際にはレジストリに必要なものが実際に配置されているものは見つかりません。私は現時点で私が保管しているもののリバースエンジニアリングをしています。

答えて

2

この記事COM in plain Cは、ATLを使用せずにCOM dllを実装する必要があります。 1800が指すように、DllGetClassObjectはCOMオブジェクトを作成するために呼び出されます。また、The COM Programmer's CookbookはCOMについての素晴らしいリファレンスです。

関連する問題