【问题标题】:call to LoadLibrary from ATL COM plug-in从 ATL COM 插件调用 LoadLibrary
【发布时间】:2011-04-28 00:34:01
【问题描述】:

嗨 我有一个基于 ATL 的 COM 插件,还有另一个我想使用的 3rd 方库。它不是 COM dll,而是用 C++ 实现的。

第 3 方 dll 详情如下:

配置类型 = 动态库(.dll)

使用 MFC = 在静态库中使用 MFC

使用 ATL = 不使用 ATL

字符集 = 使用多字节字符集

CRL 支持=不支持 clr

COM dll项目详情如下:

配置类型 = 动态库(.dll)

使用 MFC = 在共享库中使用 MFC

使用 ATL = 到 ATL 的动态链接

字符集 = 使用 unicode 字符集

CRL 支持=不支持 clr

这是我的代码

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 被调用了 3 次。 hMod 始终为 0,并且在我拥有的日志文件中

无法加载库:GetLastError() 返回 183

无法加载库:GetLastError() 返回 126

无法加载库:GetLastError() 返回 126

在哪里

-183 (0xB7) =ERROR_ALREADY_EXISTS

-126 (0x7E) =ERROR_MOD_NOT_FOUND

另一方面,如果我从另一个测试应用程序(普通的 exe 文件)调用此代码,则 loadLibrary 工作正常。 从 COM-dll 加载本机 win32 dll 是否有任何限制,我的错误是什么?

谢谢

【问题讨论】:

  • 哪个 EXE 正在加载您的 COM 对象,LicEnf.dll 是否与 EXE 在同一目录中?您是否尝试过使用 LicEnf.dll 的完全限定路径?

标签: winapi atl


【解决方案1】:

LoadLibrary 需要完整的路径名。这是工作代码

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】:

    您是否尝试指定库的完整路径?

    【讨论】:

    • 谢谢。我做过并且工作过。为什么即使所有 dll 和 exe 都在同一路径中,也需要完整路径?我想我应该可以只用文件名调用。
    猜你喜欢
    • 2013-09-08
    • 2011-06-23
    • 2014-09-20
    • 2011-06-10
    • 2012-02-28
    • 2013-10-19
    • 1970-01-01
    • 2011-11-10
    • 2010-12-16
    相关资源
    最近更新 更多