Я использую.NET DateTime для получения текущей даты и время. Я преобразовываю его в строку для использования в качестве части имени файла. Проблемой является команда OpenCV для сохранения образа, требует символа * не строковый тип, и 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);
Вам нужно прочитать о взаимодействии C ++ и Data Marshalling.
В основном: вам нужно «бросить» .NET string
к массиву C ++ TCHR
.
См.: http://msdn.microsoft.com/en-us/library/ef4c3t39 (vs.80) .aspx
Лучше всего использовать 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);
}
Возможно, вы захотите переосмыслить, используя символ ':' в имени файла, так как я не верю, что windows это очень нравится.
Браузеры по умолчанию обычно устанавливаются для каждого пользователя. Вы пробовали HKEY_CURRENT_USER вместо этого? Появляется на моей под ним правильно.
-121--3545643-Если вы получаете исключения OutOfMemory, что-то явно все еще содержит ссылку на эти объекты. Можно использовать инструмент, такой как jhat , чтобы узнать, где эти ссылки торчат.
-121--2623970-Случайный погуглинг дал мне это. Может быть, кто-то может сократить его?
cli::array<char>^ bytes = Encoding::ASCII::GetBytes(nowString);
pin_ptr<char> pinned = &bytes[0];
std::string nativeString((char*)pinned, bytes->Length);
char const* chars = nativeString.c_str();
Правка: Это дольше, чем операции класса Маршала, но работает с большим количеством кодировок. В вашем случае кажется, что более простой подход StringToHGlobalAnsi
сделает все необходимое.
Используйте функции StringToXxxAnsi
в классе Marshal
, чтобы выделить char *
буфер, затем соответствующие функции из того же класса, чтобы освободить их.