我想调用一个方法,我有C++头的dll。我从C#调用dll。输入是一个字符串,输出是二进制数据。以下3种方法中的任何一种都可能起作用,我只是不知道如何使它们中的任何一种都起作用。由于我的C#声明,所以他们可能不正确从C调用dll与C++头#
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);
2:
[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);
更新,这里就是我想我会在最后的代码。
[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 2011-01-12 09:01:24
如果您已经指定了`CharSet.Unicode`,为什么还要指定`ExactSpelling`和`EntryPoint`?那些是多余的。 – 2011-01-12 09:06:19
我不认为我的问题是将方法从C++转换为C#,但我不知道,我只是向他们展示了它们,因此您可能会发现任何错误。我认为C#签名是正确的,但我现在不知道调用方法或使用方法 – Karsten 2011-01-12 09:23:37