应用日志 | IP 地址 + 指针问题
Application Logs | IP Address + Pointer Issues
我是 C++-CLI 的新手,最近完成了我的第一个 "official" 应用程序。我被建议创建应用程序日志来跟踪其有效性。当表单打开时,应用程序会跟踪日期、时间和 PC 用户名并将其写入文本文件。
虽然我在显示 IP 地址时遇到问题,但效果很好。我在 (System::Net::IPAddress).
上收到错误 "Type name is not allowed"
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();
另外,我想记录应用程序退出的时间。之前的周长都是在应用程序开始时记录的。我认为必须有一个指针来引用应用程序关闭时的时间。任何关于如何实现这一点的见解都将不胜感激。
谢谢
System::Net::IPAddress
是 class 的名称,不是对象。它是用于存储 IP 地址的数据存储 class。这不是您可以传递给 StringToHGlobalAnsi
.
的对象
我猜您想记录您机器的 IP 地址。好的,但是哪一个?我现在使用的电脑有 6 个,如果我连接到 VPN,会有更多。我会按照此 question & answer 中的说明遍历 IP 地址,然后选择一个,但如果您有多个网卡,无论是真实的还是虚拟的,您仍然会有多个。
如果您只需要一个轻量级 'which machine is this' 标识符,您可能需要使用 Environment::MachineName
。这将为您提供当前机器的名称,作为字符串。
其他说明:
- 标准警告:虽然可以用 C++/CLI 编写应用程序的主体,甚至可以使用 WinForms 在 C++/CLI 中编写 GUI,但不推荐这样做。 C++/CLI 适用于互操作场景:在 C# 或其他 .Net 代码需要与非托管 C++ 交互的情况下,C++/CLI 可以提供两者之间的转换。对于初级开发,如果需要托管代码,建议使用 C# 和 WinForms 或 WPF,如果需要非托管代码,建议使用 C++ 和 MFC。
- 与此相关,如果您正在编写 C++/CLI,当您有选择时,我更愿意使用高级语言。因此,我更喜欢 .Net 文件 I/O,而不是非托管 io 流。你已经在写托管代码了,有一个功能非常全的标准库,你不妨用一下!
StringToHGlobalAnsi
不是从托管字符串转换为非托管字符串的首选方式。如果你确实想使用它,那很好,但是每次调用都没有相应的调用 FreeHGlobal
is a memory leak. The preferred way is to use marshal_as
, as described in Overview of Marshaling in C++。使用 marshal_as
,您可以直接从 String^
转换为 std::string
,并且两个 class 都适当地管理它们的内存,因此没有内存泄漏。 (但是使用更高级的语言,并使用 .Net classes 进行日志记录会更好。)
我是 C++-CLI 的新手,最近完成了我的第一个 "official" 应用程序。我被建议创建应用程序日志来跟踪其有效性。当表单打开时,应用程序会跟踪日期、时间和 PC 用户名并将其写入文本文件。
虽然我在显示 IP 地址时遇到问题,但效果很好。我在 (System::Net::IPAddress).
上收到错误 "Type name is not allowed" 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();
另外,我想记录应用程序退出的时间。之前的周长都是在应用程序开始时记录的。我认为必须有一个指针来引用应用程序关闭时的时间。任何关于如何实现这一点的见解都将不胜感激。
谢谢
System::Net::IPAddress
是 class 的名称,不是对象。它是用于存储 IP 地址的数据存储 class。这不是您可以传递给 StringToHGlobalAnsi
.
我猜您想记录您机器的 IP 地址。好的,但是哪一个?我现在使用的电脑有 6 个,如果我连接到 VPN,会有更多。我会按照此 question & answer 中的说明遍历 IP 地址,然后选择一个,但如果您有多个网卡,无论是真实的还是虚拟的,您仍然会有多个。
如果您只需要一个轻量级 'which machine is this' 标识符,您可能需要使用 Environment::MachineName
。这将为您提供当前机器的名称,作为字符串。
其他说明:
- 标准警告:虽然可以用 C++/CLI 编写应用程序的主体,甚至可以使用 WinForms 在 C++/CLI 中编写 GUI,但不推荐这样做。 C++/CLI 适用于互操作场景:在 C# 或其他 .Net 代码需要与非托管 C++ 交互的情况下,C++/CLI 可以提供两者之间的转换。对于初级开发,如果需要托管代码,建议使用 C# 和 WinForms 或 WPF,如果需要非托管代码,建议使用 C++ 和 MFC。
- 与此相关,如果您正在编写 C++/CLI,当您有选择时,我更愿意使用高级语言。因此,我更喜欢 .Net 文件 I/O,而不是非托管 io 流。你已经在写托管代码了,有一个功能非常全的标准库,你不妨用一下!
StringToHGlobalAnsi
不是从托管字符串转换为非托管字符串的首选方式。如果你确实想使用它,那很好,但是每次调用都没有相应的调用FreeHGlobal
is a memory leak. The preferred way is to usemarshal_as
, as described in Overview of Marshaling in C++。使用marshal_as
,您可以直接从String^
转换为std::string
,并且两个 class 都适当地管理它们的内存,因此没有内存泄漏。 (但是使用更高级的语言,并使用 .Net classes 进行日志记录会更好。)