DLL 调用错误 -The value of ESP was not properly saved across a function call. typedef void (* proc)();增加WINAPI后正常:typedef void (WINAPI * proc)();
1. error LNK2019: unresolved external symbol "void __cdecl _com_issue_error(long)" (?_com_issue_error@@YAXJ@Z) referenced in function "public: __thiscall _variant_t::_variant_t(unsigned short const *)" (??0_variant_t@@QAE@PBG@Z)
链接错误,在加入了comsupp.lib库后解决
2. error LNK2001: unresolved external symbol "const type_info::`vftable'" (??_7type_info@@6B@)
缺少RTTI支持,需要到MSFT网站上下载RTTI支持
http://support.microsoft.com/default.aspx?scid=kb%3Bzh-cn%3B830482
下完后加上对应ccrtrtti.lib库
#pragma comment(lib , "adsiid.lib")
3. bstr error LNK2019: 无法解析的外部符号 "char * __stdcall _com_util::ConvertBSTRToString(wchar_t *)"
解决方法: 加入#pragma comment(lib,"comsupp.lib"),如果任然报错,进行如下设置 在 Visual Studio 开发环境中设置此编译器选项 打开此项目的“属性页”对话框。 单击“C/C++”文件夹。 单击“语言”属性页。 修改“将 wchar_t 视为内置类型”属性。(修改为否)
搜索了一下ms的网站,找到了结果。ms认为以前的c/c++库中有一部分函数不够安全,希望程序员可以使用他们的替代安全库(Safe Library)来避免不必要的隐患。 整个原文请点击以下链接访问:Repel Attacks on Your Code with the Visual Studio 2005 Safe C and C++ Libraries
在网上搜索到的最常用的解决方案,那就是定义 _CRT_SECURE_NO_DEPRECATE 和 _SCL_SECURE_NO_DEPRECATE 来禁止vc2005对此产生警告(依然使用的是非安全库!显然并不是一个好的解决方案)。而且如果使用了ATL,则还需要定义 _ATL_SECURE_NO_DEPRECATE, 使用了MFC则需要定义 _AFX_SECURE_NO_DEPRECATE。 然而尽管如此,更好的解决方案只需要定义一个宏CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES, 那么VS将会自动替换使用他们的Safe Library来代替C/C++标准库(如strcat将被strcat_f来取代)。
即使使用了_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES,代码将依旧不够安全, 对此,ms提出了如下10点建议: 1. 不要认为 strcpy_s 和 strncpy_s( 以及其他的字符串函数)(在空间不够的时候)会自动终止拷贝(truncate截断,不截断则意味着溢出).如果需要自动截断,请使用strncpy_s (同时使用_TRUNCATE作为长度参数)。 2. 记住fopen_s缺省是独占模式。如需共享使用文件,应该使用_sopen。 3. 别忘了_dupenv_s, 它将比_getenv_s更容易使用,因为它能自动分配一个正确长度的内存(buffer)。 4. 在scanf_s中小心参数顺序。 5. 确定printf_s中格式字符串的正确。 6. 使用_countof(x)来取代sizeof(x)/sizeof(element). _countof将会正确的计算元素个数,而且如果x是一个指针,编译器将会发出一个警告(来提醒程序员,仅针对C++编译) 7. 记住所有的sizes(大小,非长度)都是使用characters(字符,unicode下一个字符占2个byte)作为单位,而不是bytes(字节). 8. 记住所有的sizes(大小,非长度,缘由同上)包含了字符串结束符'/0'(即别忘了很多情况下size需要+1)。 9. 调试的时候监视数据0xfd。 (在调试版本下)0xfd将会被填充在数据(buffer,通常是字符串)的结尾处。如果运行非你所愿,可能会得到一个长度错误。 10. 检查所有的错误。 许多新函数相比旧函数,能返回(表示)错误信息(的数值)。
————————————————————————————————————————————————
PS:定义宏_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES好像不能消除警告
我的ACE库已经正确安装配置,Samples都可以正常编译运行,但我自己写的程序却出现形如: Linking... tftp.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) int __cdecl ace_os_main_i(class ACE_Main_Base &,int,char * * const)" (__imp_?ace_os_main_i@@YAHAAVACE_Main_Base@@HQAPAD@Z) tftp.obj : error LNK2001: unresolved external symbol "int __cdecl ace_main_i(int,char * * const)" (?ace_main_i@@YAHHQAPAD@Z) Release/tftp.exe : fatal error LNK1120: 2 unresolved externals Error executing link.exe. 的错误,请问怎么解决。最好请大侠详细说一下关于工程的设置问题。
解决办法:
如果有“Cannot open include file: 'ace/SOCK_Acceptor.h': No such file or directory” 工程-设置-C/C++: Preprocessor,附加包含路径:D:/ACE_wrappers 如果有“ You must link against multi-threaded libraries when using ACE (check your project settings)” 工程-设置-C/C++: Code Generation - Use run-time library : Debug Multithreaded Dll 如果有“error C2065: 'ACE_ERROR' : undeclared identifier” error C2065: 'ACE_DEBUG' : undeclared identifier #include "ace/Log_Msg.h" error C4716: 'ace_main_i' : must return a value 在main中加入 return 0; “error LNK2001: unresolved external symbol "__declspec(dllimport) int __cdecl” 工程-设置-Link-Input: 对象/库模块:添加aced.lib 附加库路径:D:/ACE_wrappers/ace 编译client中遇到的问题 1、error C2039: 'sprintf' : is not a member of 'ACE_OS' #include "ace/OS_NS_stdio.h" 2、error C2039: 'strlen' : is not a member of 'ACE_OS' #include "ace/OS_NS_string.h" 3、error C2059: syntax error : '?' 错误在这一句: ACE_DEBUG((LM_DEBUG,?Usage egX <hostname> <port_number>/n?)); 将?改为" 4、无法找到动态链接库aced.dll于指定的路径 为系统变量PATH加上D:/ACE_wrappers/bin