私はC++ヘッダーを持つdllでメソッドを呼び出そうとしています。私はC#からDLLを呼び出しています。入力は文字列で、出力はバイナリデータです。次の3つの方法のいずれかがうまくいくかもしれませんが、私はそれらのどれかをどのように働かせるかわかりません。 C#宣言は私によって作成されているため、正しくない可能性があります。C#のC++ヘッダーでdllを呼び出す
1:私はhGlobalを取得できますが、ハンドルからデータを取得する方法はわかりません。
//CMBT_LL_WINAPI INT DLLPROC LlConvertStringToHGLOBALW(LPCWSTR pszText, _PHGLOBAL phMemory);
[DllImport("cmll15.dll", EntryPoint = "LlConvertStringToHGLOBALW", CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern int _LlConvertStringToHGlobal32(string text, ref IntPtr handle);
:
[DllImport("cmll15.dll", EntryPoint = "LlConvertStringToBLOBW", CharSet = CharSet.Unicode, ExactSpelling = true)]
//CMBT_LL_WINAPI INT DLLPROC LlConvertStringToBLOBW(LPCWSTR pszText, _PUINT8 pBytes, UINT nBytes);
private static extern int _LlConvertStringToBLOBW(string text, ref IntPtr pBytes, UInt32 nBytes);
3:
更新[DllImport("cmll15.dll", EntryPoint = "LlConvertStringToStreamW", CharSet = CharSet.Unicode, ExactSpelling = true)]
//CMBT_LL_WINAPI INT DLLPROC LlConvertStringToStreamW(LPCWSTR pszText, _PISTREAM pStream);
private static extern int _LlConvertStringToStreamW(string text, ref IntPtr pStream);
、ここで私は私が終わるだろうと思いコードです。 1について
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
private static extern UIntPtr GlobalSize(IntPtr hMem);
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
public static extern IntPtr GlobalLock(IntPtr handle);
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
public static extern IntPtr GlobalUnlock(IntPtr handle);
[DllImport("cmll15.dll", EntryPoint = "LlConvertStringToHGLOBALW", CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern int _LlConvertStringToHGlobal32(string text, ref IntPtr handle);
private static void Main(string[] args)
{
IntPtr dataHandle = IntPtr.Zero;
_LlConvertStringToHGlobal32(Contents, ref dataHandle);
try
{
var size = (uint) GlobalSize(dataHandle);
var array = new byte[size];
IntPtr dataPtr = GlobalLock(dataHandle);
try
{
Marshal.Copy(dataPtr, array, 0, array.Length);
}
finally
{
GlobalUnlock(dataPtr);
}
using (var fs = new FileStream("c:\\file.dat", FileMode.Create))
{
fs.Write(array, 0, array.Length);
}
}
finally
{
Marshal.FreeHGlobal(dataHandle);
}
}
コンパイルして実行しましたか?私たちが理解できるように問題を特定してください。 – Nawaz
'CharSet.Unicode'を指定している場合は、なぜ' ExactSpelling'と 'EntryPoint'も指定していますか?それらは冗長です。 –
私の問題は、C++からC#へのメソッドの翻訳については考えていませんが、わかりません。私はそれらを示したので、何か間違った点を見つけることができるかもしれません。私はC#のシグネチャが正しいと思いますが、メソッドを呼び出すか、メソッドからの指定された出力を使用することは今知らない – Karsten