Самый простой способ передать изменяемый System.String как изменяемый LPTSTR? - PullRequest
3 голосов
/ 21 июня 2010

BOOL PathFindOnPath (LPTSTR pszFile, LPCTSTR * ppszOtherDirs );

Я вызываю этот API из управляемого C ++. Мой pszFile находится в System.String.

Какой самый простой способ передать это как LPTSTR? (Учитывая его параметр inout)

Я пробовал pin_ptr и interior_ptr, но ни один из них, похоже, не был принят компилятором.

Ответы [ 2 ]

3 голосов
/ 21 июня 2010

Вам необходимо выполнить маршалинг (предварительно выделенного) StringBuilder вместо ссылки String.Подробности см. В этой статье MSDN о Marshaling .

.
1 голос
/ 21 июня 2010

Строки являются неизменяемыми, вы не можете передать их напрямую, даже если вы закрепите их. Более серьезно, вам придется иметь дело с возможностью того, что функция возвращает большую строку. Функция небезопасна по своей конструкции, поскольку вы не можете предотвратить ее возвращение слишком большой строки пути. Полагаю, вы вряд ли что-то можете с этим поделать, но вам придется использовать буфер, по крайней мере, достаточно большой для общих строк пути. Этот код выполнит работу:

#include <vcclr.h>
...
    String^ file = "blah.txt";
    wchar_t path[_MAX_PATH];
    {
        pin_ptr<const wchar_t> wch = PtrToStringChars(file);
        wcscpy_s(path, _MAX_PATH, wch);
    }
    BOOL ok = PathFindOnPath(path, something);

Возможно, фигурные скобки выглядят странно, это гарантирует, что управляемая строка не будет закреплена слишком долго.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...