System::String ^
をLPCWSTR
に変換したいと思います。'System :: String ^' to 'LPCWSTR'
FindFirstFile(LPCWSTR,WIN32_FIND_DATA);
ため
助けてください。
System::String ^
をLPCWSTR
に変換したいと思います。'System :: String ^' to 'LPCWSTR'
FindFirstFile(LPCWSTR,WIN32_FIND_DATA);
ため
助けてください。
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とは対照的です)。この記事は、いくつかの例を示しています
あなたが管理されていない文字列に管理し、文字列を変換する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);
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);
}
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);
は魅力的な働きをしており、最も冗長な方法であるようです。
あなたはどの言語を使用していますか? – heavyd
mはvC++を使用しています。コードトラックが失われたので、答えを使用する時間が必要です。 – Rick2047