将可修改的System.String作为可修改的LPTSTR传递的最简单方法?

时间:2010-06-21 18:31:34

标签: .net c++ string

BOOL PathFindOnPath(LPTSTR pszFile,     LPCTSTR * ppszOtherDirs );

我从托管C ++调用此API。我的pszFile在System.String中。

将此作为LPTSTR传递的最简单方法是什么? (考虑到它的inout参数)

我尝试过pin_ptr和interior_ptr,但编译器似乎都没有接受。

2 个答案:

答案 0 :(得分:3)

您需要编组(预分配)StringBuilder而不是String引用。有关详细信息,请参阅此MSDN article on Marshaling

答案 1 :(得分:1)

字符串是不可变的,即使你固定它也不能直接传递它。更严重的是,您将不得不处理函数返回更大字符串的可能性。该功能在设计上是不安全的,因为您无法阻止它返回太大的路径字符串。我想你可以做的不多,但你必须使用一个至少足够大的公共路径字符串的缓冲区。这段代码将完成工作:

#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);

花括号看起来很奇怪,它可以确保托管字符串不会长时间固定。