需要将String ^转换为char*

kma*_*n99 11 string c++-cli char

我使用.NET DateTime来获取当前日期和时间.我正在将其转换为字符串,以用作文件名的一部分.问题是保存图像的OpenCV命令需要char*而不是字符串类型,而DateTime只输出String ^类型.我该如何工作?继承人未完成的代码

String^ nowString = DateTime::Now.ToString("yyyy-MM-dd-HH:mm");
        IplImage* toSave;
        CvCapture* capture = cvCreateCameraCapture(0);
        toSave = cvQueryFrame( capture );
        cvSaveImage(nowString, toSave);
        cvReleaseImage(&toSave);
        cvReleaseCapture(&capture);
Run Code Online (Sandbox Code Playgroud)

mcd*_*ave 17

你最好的选择是使用StringToHGlobalAnsi.这是完整的代码,展示了如何完成和记忆释放分配的内存.

using namespace System::Runtime::InteropServices;

void MethodName()
{
    String^ nowString = DateTime::Now.ToString("yyyy-MM-dd-HH:mm");
    IntPtr ptrToNativeString = Marshal::StringToHGlobalAnsi(nowString);
    try
    {
        CvCapture* capture = cvCreateCameraCapture(0);
        IplImage* toSave = cvQueryFrame(capture);
        cvSaveImage(static_cast<char*>(ptrToNativeString.ToPointer()), toSave);
        cvReleaseImage(&toSave);
        cvReleaseCapture(&capture);
    }
    catch (...)
    {
        Marshal::FreeHGlobal(ptrToNativeString);
        throw;
    }
    Marshal::FreeHGlobal(ptrToNativeString);
}
Run Code Online (Sandbox Code Playgroud)

你可能想重新考虑在文件名中使用':'字符,因为我不相信windows非常喜欢这个.


Ion*_*316 5

实际上,我发现char *从a 获得a的最简单方法String^是使用好的ol' sprintf().所以在你的情况下,你可以这么简单:

char cNow[17] = { 0 };
String^ nowString = DateTime::Now.ToString("yyyy-MM-dd-HH:mm");
if (nowString->Length < sizeof(cNow)) // make sure it fits & allow space for null terminator
  sprintf(cNow, "%s", nowString);
Run Code Online (Sandbox Code Playgroud)

无需调用Marshal函数!

更新

因此,VS 2015似乎更贴近C++ 11标准,因此使用sprintf().NET String将无法正常工作.最简单的方法是使用这样的marshal_as()函数:

在代码之前包含这些行:

#include <msclr/marshal_cppstd.h>
using namespace msclr::interop;
Run Code Online (Sandbox Code Playgroud)

那应该工作:

char cNow[17] = { 0 };
String^ nowString = DateTime::Now.ToString("yyyy-MM-dd-HH:mm");
string sNow = marshal_as<string>(nowString);
if (sNow.length() < sizeof(cNow)) // make sure it fits & allow space for null terminator
  sprintf(cNow, "%s", sNow.c_str());
Run Code Online (Sandbox Code Playgroud)

否则,如果您不想使用该marshal_as()函数,可以按字符复制字符串,如下所示:

char cNow[17] = { 0 };
String^ nowString = DateTime::Now.ToString("yyyy-MM-dd-HH:mm");
if (nowString->Length < sizeof(cNow)) // make sure it fits & allow space for null terminator
{
    for (int i = 0; i < nowString->Length; i++)
        cNow[i] = static_cast<char>(nowString[i]);
}
Run Code Online (Sandbox Code Playgroud)


Mah*_*dsi 0

您需要阅读有关 C++ 互操作和数据编组的内容。

基本上:您需要将 .NET“转换”String为 C++TCHAR数组。

请参阅:http ://msdn.microsoft.com/en-us/library/ef4c3t39(VS.80).aspx