应用日志 | 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 进行日志记录会更好。)