我是C ++的新手 - CLI,最近完成了我的第一个"官方"应用。我被建议创建应用程序日志以跟踪其有效性。当表单打开时,应用程序会跟踪日期,时间和PC用户名并将其写入文本文件。
虽然我在显示IP地址时遇到问题,但效果很好。我收到错误"不允许输入类型名称" on(System :: Net :: IPAddress)。
lastlineoffile += ( std::string((char *)Marshal::StringToHGlobalAnsi(DateTime::Now.ToString("MM-dd-yy")).ToPointer()) + " " +
std::string((char *)Marshal::StringToHGlobalAnsi(DateTime::Now.ToString("HH:mm")).ToPointer()) + " " +
//std::string((char *)Marshal::StringToHGlobalAnsi(System::Net::IPAddress).ToPointer()) + " " +
std::string((char *)Marshal::StringToHGlobalAnsi(System::Environment::UserName).ToPointer()) );
std::cout << "last line to be added: " << lastlineoffile << std::endl;
file << lastlineoffile.c_str();
//saves usage text file
file.close();
此外,我想记录申请退出的时间。之前的周长都是在申请开始时记录的。我想在应用程序关闭时必须有一个引用时间的指针。任何有关如何实现这一目标的见解将不胜感激。
由于
答案 0 :(得分:2)
System::Net::IPAddress
是类的名称,而不是对象。它是用于存储IP地址的数据存储类。它不是您可以传递给StringToHGlobalAnsi
的对象。
我猜你要记录你机器的IP地址。好的,但是哪一个?我现在使用的计算机中有6台,如果我连接到VPN,它会有更多。我会按照question&amp;中的说明进行操作answer迭代IP地址,然后选择一个,但如果您有多个网卡,无论是真实的还是虚拟的,您仍然会有多个。
如果你只需要一个轻量级的“哪个机器就是这个”标识符,你可能想要使用Environment::MachineName
。这将为您提供当前机器的名称,作为字符串。
其他说明:
StringToHGlobalAnsi
不是从托管字符串转换为非托管字符串的首选方式。如果您确实想要使用它,那很好,但是每次调用而没有对FreeHGlobal
的相应调用都是内存泄漏。首选方法是使用marshal_as
,如Overview of Marshaling in C++中所述。使用marshal_as
,您可以直接从String^
转换为std::string
,并且这两个类都适当地管理其内存,因此不会发生内存泄漏。 (但是使用更高级别的语言,并使用.Net类进行日志记录会更好。)