BOOL PathFindOnPath(LPTSTR pszFile, LPCTSTR * ppszOtherDirs );
我从托管C ++调用此API。我的pszFile在System.String中。
将此作为LPTSTR传递的最简单方法是什么? (考虑到它的inout参数)
我尝试过pin_ptr和interior_ptr,但编译器似乎都没有接受。
答案 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);
花括号看起来很奇怪,它可以确保托管字符串不会长时间固定。