'System :: String ^' в 'LPCWSTR' - PullRequest
       35

'System :: String ^' в 'LPCWSTR'

10 голосов
/ 30 июня 2009

Я хочу конвертировать System::String ^ в LPCWSTR.

для

FindFirstFile(LPCWSTR,WIN32_FIND_DATA); 

Пожалуйста, помогите.

Ответы [ 4 ]

24 голосов
/ 30 июня 2009

Самый простой способ сделать это в C ++ / CLI - это использовать pin_ptr:

#include <vcclr.h>

void CallFindFirstFile(System::String^ s)
{
    WIN32_FIND_DATA data;
    pin_ptr<const wchar_t> wname = PtrToStringChars(s);
    FindFirstFile(wname, &data);
}
10 голосов
/ 30 июня 2009

Чтобы преобразовать System :: String или LPCWSTR в C ++ / CLI, вы можете использовать функцию Marshal :: StringToHGlobalAnsi для преобразования управляемых строк в неуправляемые строки.

System::String ^str = "Hello World";

IntPtr ptr = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str);

HANDLE hFind = FindFirstFile((LPCSTR)ptr.ToPointer(), data);

System::Runtime::InteropServices::Marshal::FreeHGlobal(ptr);
2 голосов
/ 30 июня 2009

Вам нужно использовать P / Invoke. Проверьте эту ссылку: http://www.pinvoke.net/default.aspx/kernel32/FindFirstFile.html

Просто добавьте подпись DllImport встроенной функции:

 [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
 static extern IntPtr FindFirstFile
     (string lpFileName, out WIN32_FIND_DATA lpFindFileData);

и CLR автоматически выполнит маршалинг собственного типа.

[Редактировать] Я только что понял, что вы используете C ++ / CLI. В этом случае вы также можете использовать неявный P / Invoke , который поддерживается только C ++ (в отличие от C # и VB.NET). В этой статье показано несколько примеров:

Как: преобразовать различные строковые типы в C ++ / CLI

0 голосов
/ 10 января 2015

Я обнаружил, что

String^ str = "C:\\my.dll";

::LoadLibraryEx(LPCWSTR)Marshal::StringToHGlobalAnsi(str).ToPointer(), 0, flags); 

не работает, возвращая код 87. Вместо этого

#include <atlstr.h>

CString s("C:\\my.dll");
::LoadLibraryEx((LPCWSTR)s, 0, flags);

работает как шарм и кажется наименее многословным методом.

...