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非常喜欢这个.
实际上,我发现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)
您需要阅读有关 C++ 互操作和数据编组的内容。
基本上:您需要将 .NET“转换”String
为 C++TCHAR
数组。
请参阅:http ://msdn.microsoft.com/en-us/library/ef4c3t39(VS.80).aspx
归档时间: |
|
查看次数: |
26013 次 |
最近记录: |