0xC0000005: 访问位置0x00000000时发生访问冲突

7

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

int GetInfo(char* Info)

该函数将在成功时返回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);
} 

这段代码在编译和链接时没有错误。但在执行时,会在上述位置返回“访问地址0x00000000时出现违规访问”的错误。请问有人可以提供建议吗?


编辑: 原帖作者(在下面某个答案的评论中)报告说,在这种情况下:

“错误是由于调用DLL中的函数需要其他DLL存在。”


1
int WINAPI(char*)int(char*)不是同一件事。你的函数至少应该被声明为int WINAPI GetInfo(char*) - Emilio Garavaglia
你确定错误在那里而不是在“GetInfo”函数中吗? - Some programmer dude
1
当异常被抛出时,调试器会显示什么作为调用堆栈等信息? - AdrianHHH
@EmilioGaravaglia 我没有 DLL 代码,因此无法更改函数。我尝试将 typedef int (WINAPI FUNC1)(char szInfo) 更改为 typedef int (FUNC1)(char szInfo),但仍然出现相同的错误。 - user2845698
@AdrianHHH 调用堆栈显示为 00000000() [下面的帧可能不正确或缺失] DevInfo.dll!002711eb() - user2845698
@user2845698:好的,试试反过来:在你的声明中不要使用WINAPI。 - Emilio Garavaglia
2个回答

6
你尝试写入(或取消引用)一个空指针。由于你已经检查了调用代码中所有可能的空指针,因此错误很可能出现在被调用的代码中。
如果你已经检查了被调用的代码,并且在其中找不到空引用异常的原因,请考虑你可能错过了正确匹配调用约定的步骤。你的函数指针类型应该与库中的完全相同:
对于int GetInfo(char* Info),typedef 应该是typedef int (*FUNC1)(char* szInfo);

2
你没有考虑到不匹配的调用约定。 - IInspectable
那么什么是“难以阅读”的错误呢?读性和堆栈有什么关系? - IInspectable
2
@DavidHeffernan 我不喜欢那些在没有努力改进的情况下就进行贬低和批评的人。如果我的答案完全错误,或者他写了一个更好的答案,或者以任何方式帮助了原始发布者,我会有不同的想法。但是他没有这样做。在我们发表评论时,该帖子的得分为“-1”,我认为这完全是没有理由的,只是因为我没有重复别人已经说过的话。 - nvoigt
2
我认为如果你详细解释一下调用约定不匹配的问题,你的答案会更好。即使其他人在评论中已经提到过,也不要紧。为了完整性,你应该在这里说明。事实上,有些人没有写自己的回答并不意味着他们就不能对别人发表评论。你并不知道谁会给你点赞或点踩。我想说的是,@IInspectable是一个很好的SO用户,做出了很多好的贡献。 - David Heffernan
如果您没有.dll的源代码,请在Dependency Walker中加载它并查找要导入的函数。它的修饰名称将告诉您调用约定(请参见名称修饰)。 - IInspectable
显示剩余6条评论

4

可能会有超过50个字符被写入缓冲区(szInfo):

char szInfo[50];


1
如果您不确定答案,应该留下评论。 - Merlevede
9
@Merlevede:我认为你误解了Jay的意图。他的意思是:"一种可能性之一",也就是说,在其他答案之外还有这个可能性。 - user13500

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接