0xC0000005:访问冲突执行位置0x00000000

use*_*698 5 c++ mfc loadlibrary getprocaddress access-violation

我正在编写一个 MFC 项目,该项目尝试调用 DLL 中的函数,该函数将以字符串形式返回一些信息。DLL中的函数如下:

int GetInfo(char* Info)
Run Code Online (Sandbox Code Playgroud)

如果成功,该函数将返回 0。信息将在字符串参数中返回。调用例程如下:

typedef int (WINAPI *FUNC1)(char* szInfo);


HINSTANCE hinstLib;
FUNC1 GetInfo;
char szInfo[50];

hinstLib = LoadLibrary(TEXT("DevInfo.dll"));

// If the handle is valid, try to get the function address.
if (hinstLib != NULL) 
{ 
    GetInfo = (FUNC1) GetProcAddress(hinstLib, "GetInfo"); 

    // If the function address is valid, call the function.
    if (NULL != GetInfo) 
    {
        if((GetInfo) (szInfo)) // Error here!!
        {
            AfxMessageBox(_T("Error Reading"));
        }
    }

    FreeLibrary(hinstLib);
} 
Run Code Online (Sandbox Code Playgroud)

此代码在编译和链接时没有错误。执行时,会在上述位置返回“访问冲突执行位置0x00000000”的错误。任何人都可以建议吗?

nvo*_*igt 6

您尝试写入(或取消引用)NULL 指针。当您检查调用代码中所有可能的 NULL 时,错误很可能出现在您的调用代码中。

如果您检查了调用的代码,但也找不到空引用异常的原因,请考虑您可能错过了正确匹配调用约定。函数指针的类型应该与库中的类型完全相同:

对于int GetInfo(char* Info)typedef 应该是typedef int (*FUNC1)(char* szInfo);

  • 您没有考虑不匹配的调用约定。 (2认同)
  • @DavidHeffernan 我不喜欢那些在没有努力实际改进的情况下就投反对票和批评的人。如果我的答案完全错误,或者他写了一个更好的答案或以任何方式帮助了原始发布者,我会有所不同。但他没有。在我们发表评论时,该帖子的状态为“-1”,我认为这是完全没有根据的,因为我没有重复其他人已经说过的话。 (2认同)
  • 我认为如果详细说明调用约定不匹配,您的答案会更好。其他人是否在评论中说过并不重要。为了完整起见,您应该在这里声明。即使某人没有写出自己的答案,但这并不意味着他们没有资格评论他人。你不知道谁实际上投了反对票。我想说 @IInspectable 是一个优秀的 SO 用户,做出了很多很好的贡献。 (2认同)