应用程序日志| IP地址+指针问题

时间:2018-01-19 00:21:08

标签: winforms c++-cli marshalling

我是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();

此外,我想记录申请退出的时间。之前的周长都是在申请开始时记录的。我想在应用程序关闭时必须有一个引用时间的指针。任何有关如何实现这一目标的见解将不胜感激。

由于

1 个答案:

答案 0 :(得分:2)

System::Net::IPAddress是类的名称,而不是对象。它是用于存储IP地址的数据存储类。它不是您可以传递给StringToHGlobalAnsi的对象。

我猜你要记录你机器的IP地址。好的,但是哪一个?我现在使用的计算机中有6台,如果我连接到VPN,它会有更多。我会按照question&amp;中的说明进行操作answer迭代IP地址,然后选择一个,但如果您有多个网卡,无论是真实的还是虚拟的,您仍然会有多个。

如果你只需要一个轻量级的“哪个机器就是这个”标识符,你可能想要使用Environment::MachineName。这将为您提供当前机器的名称,作为字符串。

其他说明:

  • 标准警告:虽然可以在C ++ / CLI中编写应用程序的主体,甚至可以使用WinForms在C ++ / CLI中编写GUI,但不建议这样做。 C ++ / CLI适用于互操作场景:C#或其他.Net代码需要与非托管C ++接口,C ++ / CLI可以提供两者之间的转换。对于主要开发,如果您需要托管代码,建议将C#与WinForms或WPF一起使用,如果您想要非托管,则建议使用带有MFC的C ++。
    • 与此相关,如果您正在编写C ++ / CLI,我更愿意在您选择时使用更高级别的语言。因此,我倾向于.Net文件I / O,而不是非托管的io流。您已经在编写托管代码,使用功能齐全的标准库,您也可以使用它!
  • StringToHGlobalAnsi不是从托管字符串转换为非托管字符串的首选方式。如果您确实想要使用它,那很好,但是每次调用而没有对FreeHGlobal的相应调用都是内存泄漏。首选方法是使用marshal_as,如Overview of Marshaling in C++中所述。使用marshal_as,您可以直接从String^转换为std::string,并且这两个类都适当地管理其内存,因此不会发生内存泄漏。 (但是使用更高级别的语言,并使用.Net类进行日志记录会更好。)