2011-07-28 67 views
1

我在微軟創建了一個COM DLL的Visual Basic 2008年我試圖調用從C++項目這個DLL。在C++我用「#進口U:\路徑... \ 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"; 
} 

當我調用這個函數時,我得到一個Class Not Registered錯誤。我曾嘗試使用REGSVR32註冊DLL,我得到的消息「MyComDll.dll加載,但DLLREgeisterServer入口點沒有被發現。這個文件不能被註冊。」

我如何註冊類和得到這個工作?

+1

.NET程序集必須註冊Regasm.exe。在您的開發機器上,使用/ codebase選項,因此您不必將其放入GAC。忽略你得到的警告。 –

+0

希望我能接受這個答案。 – James

回答

0

如果不能註冊,有兩種可能性

  1. 你缺少一個依賴庫。下載dependency walker並查看缺少的內容。一些標記爲缺失的是紅鯡魚(例如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

如果這是您的問題,那麼在您創建項目時會出現在項目設置中。我可能不知道如何在後面補充說明,如果你使用的是ATL,那麼它可能是可能的,如果沒有,這將是一個正確的痛苦。 – ssube

1

嘗試使用管理員權限註冊它, 右鍵單擊命令提示符,然後選擇以管理員身份運行,併爲系統提供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; 

}