gpt4 book ai didi

c++ - LoadLibrary 的 STATUS_STACK_BUFFER_OVERRUN

转载 作者:行者123 更新时间:2023-11-28 01:07:44 30 4
gpt4 key购买 nike

当我用 LoadLibrary 加载 iphlpapi.dll 时,我的堆栈缓冲区溢出了!我该如何解决这个问题?!

typedef DWORD (*GetExtendedTcpTable)(PVOID, PDWORD, BOOL, ULONG, TCP_TABLE_CLASS, ULONG);   
GetExtendedTcpTable _GetExtendedTcpTable;

// load function at runtime
HINSTANCE hstLibrary = LoadLibrary("C:\\Windows\\System32\\Iphlpapi.dll");

if(!hstLibrary)
{
::MessageBox(NULL,"Can't load Iphlpapi.dll!\n","Error",
MB_OK + MB_ICONEXCLAMATION + MB_TASKMODAL);

FreeLibrary(hstLibrary); // free memory

exit(0);
}

// load function address from dll
_GetExtendedTcpTable = (GetExtendedTcpTable)GetProcAddress(hstLibrary, "GetExtendedTcpTable");

lib 函数的加载和执行工作正常,但在某些时候我的程序抛出 STATUS_STACK_BUFFER_OVERRUN 异常!(有一点:当我评论字符串操作时,错误发生在几行之后)

当我不使用 LoadLibrary 和 GetProcAddress(静态绑定(bind))时 -> 没有缓冲区溢出!

感谢和问候,

里昂22

最佳答案

您需要指定调用约定:

typedef DWORD (WINAPI * GetExtendedTcpTable)(PVOID, PDWORD, BOOL, ULONG, TCP_TABLE_CLASS, ULONG);   

VS默认的调用约定是__cdecl,Windows API需要__stdcall。它们的不同之处在于参数堆栈的处理方式,最显着的是 __cdecl 需要调用方清理,而 __stdcall 需要被调用函数清理。

WINAPI 定义为 __stdcall

参见例如Calling Conventions Demystified

关于c++ - LoadLibrary 的 STATUS_STACK_BUFFER_OVERRUN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5259320/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com