2009-06-30 39 views
10

System::String ^LPCWSTRに変換したいと思います。'System :: String ^' to 'LPCWSTR'

FindFirstFile(LPCWSTR,WIN32_FIND_DATA); 

ため

助けてください。

+0

あなたはどの言語を使用していますか? – heavyd

+0

mはvC++を使用しています。コードトラックが失われたので、答えを使用する時間が必要です。 – Rick2047

答えて

2

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を使用していることを知りました。その場合は、implicit P/Invokeを使用することもできます。これは、C++だけがサポートする機能です(C#およびVB.NETとは対照的です)。この記事は、いくつかの例を示しています

How to: Convert Between Various String Types in C++/CLI

10

あなたが管理されていない文字列に管理し、文字列を変換するMarshal::StringToHGlobalAnsi機能を使用することができますC++/CLIでのシステム::文字列OT LPCWSTRを変換します。

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

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); 
} 
0

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

は魅力的な働きをしており、最も冗長な方法であるようです。