Должен преобразовать String^ для обугливания *

Я использую.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);
11
задан jalf 1 February 2010 в 16:06
поделиться

4 ответа

Вам нужно прочитать о взаимодействии C ++ и Data Marshalling.

В основном: вам нужно «бросить» .NET string к массиву C ++ TCHR .

См.: http://msdn.microsoft.com/en-us/library/ef4c3t39 (vs.80) .aspx

0
ответ дан 3 December 2019 в 04:52
поделиться

Лучше всего использовать 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 это очень нравится.

17
ответ дан 3 December 2019 в 04:52
поделиться

Браузеры по умолчанию обычно устанавливаются для каждого пользователя. Вы пробовали 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 сделает все необходимое.

1
ответ дан 3 December 2019 в 04:52
поделиться

Используйте функции StringToXxxAnsi в классе Marshal , чтобы выделить char * буфер, затем соответствующие функции из того же класса, чтобы освободить их.

0
ответ дан 3 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: