C++ 静态库调用错误:异常:";向存根传递了一个空引用指针;(使用winsock2和Win32)

C++ 静态库调用错误:异常:";向存根传递了一个空引用指针;(使用winsock2和Win32),c++,winapi,visual-studio-2008,winsock2,C++,Winapi,Visual Studio 2008,Winsock2,我创建了一个运行良好的windows控制台应用程序,但尝试在另一个静态库(作为更大项目的一部分)中使用Winsock2(Ws2_32.lib)会引发异常 代码编译良好,exe运行正常,对WSAStartup()和gethostbyname()的调用按预期工作,但随后调用gethostbyname() 原因: TestApp.exe中0x76e1c41f处的首次机会异常:0x000006F4:向存根传递了空引用指针。 这导致: TestApp.exe中0x7505cd99(rpcrt4.dll)处

我创建了一个运行良好的windows控制台应用程序,但尝试在另一个静态库(作为更大项目的一部分)中使用Winsock2(Ws2_32.lib)会引发异常

代码编译良好,exe运行正常,对WSAStartup()和gethostbyname()的调用按预期工作,但随后调用gethostbyname() 原因:

TestApp.exe中0x76e1c41f处的首次机会异常:0x000006F4:向存根传递了空引用指针。

这导致:

TestApp.exe中0x7505cd99(rpcrt4.dll)处的第一次机会异常:0xC0020043:RPC中发生内部错误。

我仔细检查了调用代码是否相同,并检查了链接器是否使用了*.h*.dll和*.lib的正确版本——据我所知。 我比较了这两个应用的项目设置,看不到任何异常。 我还确保项目中的所有库都使用相同的字符集

[编辑:发现两个应用程序之间的差异后的更改只是是否打开了调试器异常]

我可以通过异常继续,代码似乎正在运行,但函数中不再有有效的调试符号。这不是崩溃,但我当然不希望每次调用函数时都出现异常-我可以很明显地关闭异常中断,但它们不是在告诉我出了什么问题吗

我目前正在尝试从MSDN symbol server/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 

我收到此异常
“0x000006F4:向存根传递了一个空引用指针。”

事实证明,禁用我的第三方防火墙阻止了引发异常。也许是防火墙拦截了请求,把事情搞砸了


可能值得您一试:)

在调试器中运行它并仔细查看代码。不幸的是,我找不到ws2_32.lib的符号,堆栈只提供:[注释时间用完:\](@Huytard)堆栈:
KernelBase.dll!75f1c41f()
[下面的帧可能不正确和/或缺失,没有为KernelBase.dll加载符号]
KernelBase.dll!75f1c41f()
rpcrt4.dll!LRPC_BASE_CCALL::FreeObject()+0x3c38字节
对应于asm
75F1C419调用dword ptr ds:[75F1115Ch]
75F1C41F离开