2011-07-28 90 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; 

}