2011-07-28 15 views
1

Microsoft Visual Basic 2008でCOM dllを作成しました。このDLLをC++プロジェクトから呼び出そうとしています。 C++では "#import U:\ path ... \ MyComDll.tlb"を使用しましたが、次にDisplayMessage()メソッドに次のコードを使用しました。C++からCOM DLLを呼び出す「クラスが登録されていません」

FB::variant CmdAccessAPI::filePSV(std::string file) 
{ 

CoInitialize(NULL); 
try 
{ 
    _MyComClassPtr spIMyComClass; 
    HRESULT hr = spIMyComClass.CreateInstance(__uuidof(_MyComClass)); 
    if (FAILED(hr)) throw _com_error(hr); 

    spIMyComClass->DisplayMessage(); 
} 
    catch (std::exception& e) 
{ 
    CString strMsg(e.what()); 
    MessageBox(NULL, strMsg, L"Error", MB_OK); 
} 
catch (_com_error& e) 
{ 
    CString strMsg; 
    strMsg = (TCHAR*) e.Description(); 
    strMsg += _T("\n"); 
    strMsg += (TCHAR*) e.ErrorMessage(); 
    MessageBox(NULL, strMsg, L"COM Error", MB_OK); 
} 
CoUninitialize(); 
return "test"; 
} 

この関数を呼び出すと、クラスが登録されていないというエラーが表示されます。 regsvr32を使用してDLLを登録しようとしましたが、「MyComDll.dllがロードされましたが、DLLREgeisterServerエントリポイントが見つかりませんでした。このファイルを登録することはできません」というメッセージが表示されます。

クラスを登録してこれを動作させるにはどうすればよいですか?

+1

.NETアセンブリはRegasm.exeで登録する必要があります。あなたの開発マシンでは、/ codebaseオプションを使ってGACに入れる必要はありません。あなたが得る警告を無視してください。 –

+0

私はこれを答えとして受け入れることができます。 – James

答えて

0

あなたはそれを登録することはできません場合は、あなたが依存ライブラリが欠落している2つの可能性

  1. があります。依存関係ウォーカーをダウンロードし、欠けているものを見てください。不足しているとマークされているものの一部は赤い文字列です(例ieshims.dll)が、あなたのものである可能性があります。

  2. 何かがあなたのCOMセットアップのレールから外れました。あなたは登録されているとしてあなたのDLLをデバッグすることができますし、どこに失敗したATLコードを掘ります。

+0

"DLLREgeisterServerエントリポイントが見つかりませんでした"というメッセージが表示されているので、#1にはなりません(依存関係なしでDLLをロードすることはできません)。しかし、#1は他の場合には注意が必要です。 – crashmstr

0

疑わしいので、regsvr32を使用してDLLを登録する必要があります。

しかし、そのエラーは、DLLにスタブが含まれていない(または登録できない)か、スタブではなくライブラリを登録しようとしていることを示唆しています。

VSプロジェクトとコードがDLLにプロキシ/スタブ関数を含むように設定されていること、またはプロキシDLLを登録していることを確認してください。

+0

"VSプロジェクトとコードがDLLにプロキシ/スタブ関数を含めるように設定されていることを確認するか、プロキシDLLを登録してください。" - どうしたらいいですか? – James

+0

問題が発生した場合は、作成時にプロジェクト設定に反映されます。私は後でそれをどのように追加するかについて完全にはわかっていないが、Googleが知っているかもしれない。あなたがATLを使用している場合は可能かもしれませんが、そうでなければ、それは正しい痛みになります。 – ssube

1

admin権限を使用して登録を試みてください。 コマンドプロンプトを右クリックし、[管理者として実行]を選択し、システムに32のパスを指定します。 次に、regsvr32 xyz.dllを使用します。

0
**include the below code** and export these functions with .def file 

wchar_t *convertCharArrayToLPCWSTR(const char* charArray) 
{ 
    wchar_t* wString=new wchar_t[4096]; 
    MultiByteToWideChar(CP_ACP, 0, charArray, -1, wString, 4096); 
    return wString; 
} 

BOOL Register(HKEY mainKey,const char *subKey,LPCTSTR val_name, DWORD dwType,char * chardata,DWORD dwDataSize) 
{ 
    HKEY hk; 
    if (ERROR_SUCCESS != RegCreateKey(mainKey,convertCharArrayToLPCWSTR(subKey),&hk)) 
     return FALSE; 
    LPCTSTR data=convertCharArrayToLPCWSTR(chardata); 
    if (ERROR_SUCCESS != RegSetValueEx(hk,val_name,0,dwType,(CONST BYTE *)data,2*dwDataSize)) 
     return FALSE; 
    if (ERROR_SUCCESS != RegCloseKey(hk)) 
     return FALSE; 
    return TRUE; 
} 

HRESULT __stdcall DllRegisterServer(void) 
{ 

    WCHAR *lpwszClsid; 
    char szBuff[MAX_PATH]="new multiplication Algorithm"; 
    char szClsid[MAX_PATH]="", szInproc[MAX_PATH]="",szProgId[MAX_PATH]; 
    char szDescriptionVal[256]=""; 
    StringFromCLSID(CLSID_MultiplicationObject,&lpwszClsid); 
    sprintf(szClsid,"%S",lpwszClsid); 
    sprintf(szInproc,"%s\\%s\\%s","clsid",szClsid,"InprocServer32"); 
    sprintf(szProgId,"%s\\%s\\%s","clsid",szClsid,"ProgId"); 
    sprintf(szDescriptionVal,"%s\\%s","clsid",szClsid); 
    Register (HKEY_CLASSES_ROOT,szDescriptionVal,NULL,REG_SZ,szBuff,strlen(szBuff)); 
    //InprocServer32 
    GetModuleFileNameA(g_hModule,szBuff,sizeof(szBuff)); 
    Register (HKEY_CLASSES_ROOT,szInproc,NULL,REG_SZ,szBuff,strlen((szBuff))); 
    //ProgId 
    strcpy(szBuff,multiplicationObjProgId); 
    Register (HKEY_CLASSES_ROOT,szProgId,NULL,REG_SZ,szBuff,strlen(szBuff)); 
    return 1; 
} 

HRESULT __stdcall DllUnregisterServer(void) 
{ 
    WCHAR *lpwszClsid; 
    char szBuff[MAX_PATH]="new multiplication Algorithm"; 
    char szClsid[MAX_PATH]="", szInproc[MAX_PATH]="",szProgId[MAX_PATH]; 
    char szDescriptionVal[256]=""; 
    StringFromCLSID(CLSID_MultiplicationObject,&lpwszClsid); 
    sprintf(szClsid,"%S",lpwszClsid); 
    sprintf(szInproc,"%s\\%s\\%s","clsid",szClsid,"InprocServer32"); 
    sprintf(szProgId,"%s\\%s\\%s","clsid",szClsid,"ProgId"); 
    sprintf(szDescriptionVal,"%s\\%s","clsid",szClsid); 
    RegDeleteKey(HKEY_CLASSES_ROOT,convertCharArrayToLPCWSTR(szInproc)); 
    RegDeleteKey(HKEY_CLASSES_ROOT,convertCharArrayToLPCWSTR(szProgId)); 
    RegDeleteKey(HKEY_CLASSES_ROOT,convertCharArrayToLPCWSTR(szDescriptionVal)); 
    return 1; 

} 
関連する問題