找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4867|回复: 7

《C++NPv1》里的第一个小例子的问题

[复制链接]
发表于 2008-4-29 10:32:05 | 显示全部楼层 |阅读模式
《C++NPv1》里的第一个小例子(注释部分是我自己加的),运行时peer_addr.set (80, server_hostname)总是出错。
经过跟踪,发现是getprotobyname()总出错,通过查msdn是因为没有调用WSAStartup(),加上注释部分就可以了。
难道还要手动的WSAStartup()?代码的问题在哪儿?
  1. #include "ace/INET_Addr.h"
  2. #include "ace/SOCK_Connector.h"
  3. #include "ace/SOCK_Stream.h"
  4. #include <iostream>
  5. using namespace std;
  6. int main (int argc, char *argv[])
  7. {
  8. // WORD wVersionRequested;
  9. // WSADATA wsaData;
  10. // int err;
  11.   
  12. // wVersionRequested = MAKEWORD( 2, 2 );
  13.   
  14. // err = WSAStartup( wVersionRequested, &wsaData );
  15. // if ( err != 0 ) {
  16. //  return 2;
  17. // }
  18. const char *pathname =
  19.   argc > 1 ? argv[1] : "index.html";
  20. const char *server_hostname =
  21.   argc > 2 ? argv[2] : "ace.ece.uci.edu";
  22. ACE_SOCK_Connector connector;
  23. ACE_SOCK_Stream peer;
  24. ACE_INET_Addr peer_addr;
  25. if (peer_addr.set (80, server_hostname) == -1)
  26. {
  27.   cout << "addr set error" << endl;
  28.   return 1;
  29. }
  30. else if (connector.connect (peer, peer_addr) == -1)
  31. {
  32.   cout << "connect error" << endl;
  33.   return 1;
  34. }
  35. else
  36. {
  37.   cout << "success" << endl;
  38. }
  39. return 0;
  40. }
复制代码
请高手指教,谢谢。
 楼主| 发表于 2008-4-29 10:32:13 | 显示全部楼层
不会的啊,你直接打开运行

D:\work\ace\ACE_wrappers\examples\C++NPv1\C++NPv1_Logging_Client.vcproj

ace 下面的例子程序,你看他都不要这样,要这样,还要 ace 搞什么???
 楼主| 发表于 2008-4-29 10:32:20 | 显示全部楼层
两种办法,

第一,用int ACE_TMAIN(int argc, ACE_TCHAR* argv[]) 代替你的main即可。
这里面已经自动初始化了ACE。

第二,使用ACE::init()和ACE::fini()。前者在使用任何ACE功能前声明,后者在程序结束时候调用。
 楼主| 发表于 2008-4-29 10:32:28 | 显示全部楼层
多谢各位

我试了一下

使用ACE::init()和ACE::fini(),是可以的

用int ACE_TMAIN(int argc, ACE_TCHAR* argv[]) ,总是有其他错误。
e:\ace\test\test1\test1\main.cpp(29) : error C2446: ':' : no conversion from 'const char *' to 'ACE_TCHAR *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
查看ACE源码,ACE_TCHAR就是char。直接用char代替又会出现连接错误
main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) int __cdecl ace_os_wmain_i(class ACE_Main_Base &,int,wchar_t * * const)" (__imp_?ace_os_wmain_i@@YAHAAVACE_Main_Base@@HQAPA_W@Z) referenced in function _wmain
main.obj : error LNK2019: unresolved external symbol "int __cdecl ace_wmain_i(int,wchar_t * * const)" (?ace_wmain_i@@YAHHQAPA_W@Z) referenced in function "private: virtual int __thiscall ACE_Main::run_i(int,wchar_t * * const)" (?run_i@ACE_Main@@EAEHHQAPA_W@Z)
查看ACE源码,ACE_TMAIN就是main,可是怎么会出现ace_os_wmain_i的连接错误?

另外,hzhxxx说的C++NPv1_Logging_Client.vcproj里好像也没有用上述方法。
 楼主| 发表于 2008-4-29 10:32:36 | 显示全部楼层
有几个可能的原因,你可以排查一下。使用ACE_TMAIN的办法,肯定是可以的。我一直都是用这个办法。
1、是动态链接还是静态链接ACE
2、是否填入了正确的链接库
3、是否是UNICODE
你看看你的工程就知道了。
 楼主| 发表于 2008-4-29 10:32:44 | 显示全部楼层
哦,原来是UNICODE的问题,设成Not Set就好了

可是,看ACE的代码,根据编译前的设置,int ACE_TMAIN(int argc, ACE_TCHAR* argv[]) 和int main(...)是一样的啊

而且C++NPv1_Logging_Client.vcproj里也没有用上述方法,好像是可以的。
 楼主| 发表于 2008-4-29 10:32:56 | 显示全部楼层
我看到了《ACE Programmer's Guide》里有相关的描述:

For use cases in which you are writing a regular C++ application that has the standard int main (int argc, char *argv[]) entry point or the wide-character-enabled ACE_TMAIN entry point shown in Section 1.7, ACE magically redefines your main() function and inserts its own, which instantiates the Object Manager on the runtime stack and then calls your main() function. When your main() function returns, the Object Manager is run down as well.

但是他是如何实现“magically redefines”的呢?
“wide-character-enabled ACE_TMAIN entry point”,那有没有unicode-enabled的入口呢?
 楼主| 发表于 2008-4-29 10:33:03 | 显示全部楼层
编译问题,需要使用UNICODE编译ACE很简单的,编译支持问题。我转了一篇文章,你看看就知道了。

如果在 ace中的config.h中定义了
#define ACE_USE_WCHAR
则编译为支持unicode的ace版本
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 19:45 , Processed in 0.022089 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表