我创建了一个运行良好的 Windows 控制台应用程序,但尝试在另一个静态库(作为更大项目的一部分)中使用 Winsock2 (Ws2_32.lib) 会引发异常。
代码编译正常,exe 运行良好,调用 WSAStartup() 和 gethostbyname() 按预期工作,但随后调用 gethostbyname() 会导致:
First-chance exception at 0x76e1c41f in TestApp.exe: 0x000006F4: A null reference pointer was passed to the stub.
这导致:
First-chance exception at 0x7505cd99 (rpcrt4.dll) in TestApp.exe: 0xC0020043: An internal error occurred in RPC.
我仔细检查了调用代码是否相同,并检查了链接器是否正在使用正确版本的 *.h *.dll 和 *.lib - 据我所知。我已经比较了这两个应用程序的项目设置,但看不到任何异常。我还确保项目中的所有库都使用相同的字符集。
[编辑:发现两个应用程序之间的差异后的变化只是调试器异常是否打开]
我可以继续排除异常并且代码似乎可以运行,但函数中不再有有效的调试符号。这不是崩溃,但当然 id 每次调用函数时都没有异常 - 我显然可以关闭异常中断,但他们不是在那里告诉我有什么问题吗?
我目前正在尝试从 MSDN 符号服务器/SymChk.exe 获取 ws2_32.lib 和其他模块的最新符号
[编辑 2 - 终于得到了堆栈的符号]
> rpcrt4.dll!_NdrClientCall2() + 0x301 bytes
FWPUCLNT.DLL!_FwppProxyEngineOpen@24() + 0x19 bytes
FWPUCLNT.DLL!_FwppSessionCreate@20() + 0xd1 bytes
FWPUCLNT.DLL!_FwpmEngineOpen0@20() + 0x29 bytes
FWPUCLNT.DLL!_FwpIsNameCacheEnabledForProcess@4() + 0x7778 bytes
FWPUCLNT.DLL!_FwpmProcessNameResolutionEvent0@16() + 0x74 bytes
FWPUCLNT.DLL!_NamespaceCallout@12() + 0x72 bytes
ws2_32.dll!PrepareNamespaceCalloutBlob() + 0x153 bytes
ws2_32.dll!getxyDataEnt() + 0x74a7 bytes
ws2_32.dll!_gethostbyname@4() + 0xe7 bytes