2010-10-20 5 views
0

Salut J'ai un plugin COM basé sur ATL et il y a une autre bibliothèque tierce que je veux utiliser. Ce n'est pas COM dll et implémenté en C++.appel à LoadLibrary à partir du plug-in ATL COM

détails sur dll 3ème partie comme suit:

Type de configuration = Library (Dynamic .dll)

Utilisation du MFC = Utiliser MFC dans une bibliothèque statique

Utilisation d'ATL = non ATL à l'aide

jeu de caractères = utilisation de carbonisation multi-btye réglé

support CRL = no clr s upport

détails sur le projet dll COM comme suit:

Type de configuration = Library (Dynamic .dll)

Utilisation du MFC = Utiliser MFC dans une bibliothèque partagée

Utilisation des ATL = liaison dynamique à ATL

jeu de caractères unicode = utilisation de carbonisation mis

CRL supp ort = pas de support clr

Ceci est mon code

HRESULT FinalConstruct() 
{ 
    LPCWSTR libPath = _T("LicEnf.dll") ; 
    const char * clibPath = "LicEnf.dll" ; 

    SetLastError(0); 
    HMODULE hMod = LoadLibraryA(clibPath); 
    if(hMod==NULL) 
    { 

     LOG4CXX_TRACE(CALMLogger::GetModuleLogger(ModuleName), 
      _T("Could not load library:GetLastError() returned ") << GetLastError()); 

    } 

    return S_OK; 
} 

FinalConstruct est appelé 3fois. hMod toujours 0 et le fichier journal j'ai

Impossible de charger la bibliothèque: GetLastError() retourné 183

Impossible de charger la bibliothèque: GetLastError() retourné 126

Impossible de charger la bibliothèque: GetLastError() retourné 126

-183 (0xB7) = ERROR_ALREADY_EXISTS

-126 (0x7E) = ERROR_MOD_NOT_FOUND

D'autre part, si j'appelle ce code d'une autre application de test qui est un fichier exe ordinaire, loadLibrary fonctionne très bien. Existe-t-il une limite au chargement d'une DLL win32 native à partir de COM-dll et quelle est mon erreur ici?

Merci

+1

Quel EXE vous charge l'objet COM, et LicEnf.dll est-il dans le même répertoire que l'EXE?Avez-vous essayé d'utiliser un chemin complet vers LicEnf.dll? –

Répondre

-1

LoadLibrary a demandé le chemin d'accès complet. voici le code de travail

HRESULT FinalConstruct() 
{ 
    LPCWSTR libPath = _T("d:\\projects\\LMS\\src\\LMS_LIB\\LicEnf\\Debug\\LicEnf.dll") ; 
    DWORD retval=0; 
    BOOL success; 
    TCHAR buffer[BUFSIZE]=TEXT(""); 
    TCHAR buf[BUFSIZE]=TEXT(""); 
    TCHAR** lppPart={NULL}; 

    SetLastError(0); 
    SetErrorMode(0); 
    retval = GetFullPathName(libPath, 
     BUFSIZE, 
     buffer, 
     lppPart); 

    HMODULE hMod = LoadLibrary(buffer); 
    if(hMod==NULL) 
    { 
     int lastError = GetLastError(); 
     CString message; 
     message.Format(_T("Failed in finding LicEnf.dll (%d)"), lastError); 
     LOG4CXX_TRACE(CALMLogger::GetModuleLogger(ModuleName),message); 

    } 

    return S_OK; 
} 
2

Est-ce que vous essayez de spécifier le chemin complet à la bibliothèque?

+0

thnx. Je l'ai fait et travaillé. Comment se fait le chemin complet est nécessaire même tous les dll et exe sont dans le même chemin? Je pensais que je devrais être capable d'appeler avec juste le nom de fichier. – tguclu

Questions connexes