【问题标题】:WinAPI function LoadLibrary() causing function failed during execution errorWinAPI 函数 LoadLibrary() 导致函数在执行期间失败错误
【发布时间】:2017-11-20 08:50:22
【问题描述】:

以下代码使用 LoadLibrary() 在运行时加载 dll。

boolean Load_Internals_dll()
{
    boolean result = true;

    //LOG_INIT;
    HINSTANCE hApexRLIO = LoadLibrary(L"APEX_RLIO_Internals.dll");

    printf("Checking getlasterror after loadlibrary:\n",GetLastError());
    if(NULL == hApexRLIO)
    {
        result = false;
        printf("[ERR]:  Unable to load dll\n");
        LOG_PRINT(" [ERR]:  Unable to load dll.\n" );

    }
    result = InitRSIDComm_Lib_Func();
    //LOG_EXIT;
    return result;
}

加载dll后发现句柄hApexRLIO不为空,但函数GetLastError()返回系统错误码1627(函数执行失败)。

此错误的可能原因是什么?

网络上没有太多关于这个错误代码的文档, VC++十加仑头请帮我解决这个问题。

【问题讨论】:

  • 函数成功,因为返回的句柄值不为空,所以GetLastEror返回的值似乎根本不相关。
  • 除非您遇到错误,否则不要致电GetLastError。
  • @JonathanPotter:这只是大致正确的。一些 API 不将最后一个错误代码设置为失败,一些将其设置为失败,而其他 API 将其设置为成功失败。确切的规则是:不要打电话给GetLastError,除非文档告诉你这样做。

标签: c++ windows winapi visual-c++ dll


【解决方案1】:

documentation 说:

如果函数成功,返回值是模块句柄。

如果函数失败,返回值为NULL。要获取更多错误信息,请致电GetLastError。

函数成功时,返回值不是NULL。这是你的场景。该文档没有承诺如果函数成功,GetLastError 将返回什么。一些 Win32 API 函数会在返回之前调用SetLastError(ERROR_SUCCESS),但不是全部。这是一个没有。

换句话说,没有错误。函数返回值表示成功,不要调用GetLastError,因为它返回的值没有意义。

【讨论】:

  • 如果您在拨打电话之前自己明确地调用 SetLastError(ERROR_SUCCESS),您甚至不能保证最后一个错误在成功的情况下保持不变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
相关资源
最近更新 更多