我一直在尝试将信息传入/传出 c# 到 c++ dll。我根本无法更改 dll。
基本上,我找到了一种有效的方法 - 但我不太明白为什么这种方法有效,而其他方法则无效。如果我能得到某种理解,那就太好了。
这是我的工作代码:
public class Helper
{
[DllImport("C:/abc/abc.dll")]
static extern int DLL_GetData(ref keyData key, IntPtr stringData);
// the ref is just a pointer passed in, but is not modified in the dll. the stringData is filled in by the dll, which we then marshal back into a struct
public string GetStringData()
{
keyData key = new keyData();
key.DataKey.text = "5555555";
key.ProdKey.length = 7;
key.Version.text = "2012";
key.Version.length = 4;
IntPtr keyPtr = Marshal.AllocHGlobal(Marshal.SizeOf(key));
stringData data = new stringData();
IntPtr dataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(data));
int status = DLL_GetData(ref key, dataPtr);
data = (stringData)Marshal.PtrToStructure(dataPtr, typeof(stringData));
return data.text;
}
[StructLayout(LayoutKind.Sequential)]
public struct keyData
{
[MarshalAs(UnmanagedType.Struct)]
public stringData DataKey;
[MarshalAs(UnmanagedType.Struct)]
public stringData Version;
}
[StructLayout(LayoutKind.Sequential)]
public struct stringData
{
[MarshalAs(UnmanagedType.LPWStr)]
public string text;
public int length;
}
}
所以,如果我调用 GetStringData(),我可以取回我想要的所需字符串。但是,我很困惑为什么只对 keyData 使用 ref,而对 stringData 使用 IntPtr 应该对我有用?
我尝试将这两个参数都用作参考值,并且都用作 IntPtrs,但无济于事。我真的只是偶然地尝试使用一个作为 ref 和一个作为 IntPtr。问题真的是——为什么会这样?我真的很想了解为什么会这样......希望我已经包含了足够的代码和信息。
下面是dll函数方法:
DLL_GetData(KEYDATA *key, STRINGDATA *data);
现在,我不知道这个函数的主体是什么(否则我会发布它)。但我希望尝试使用它。
所以 STRINGDATA 结构:
typedef struct STRINGDATA
{
unsigned short* text;
int length;
}STRINGDATA;
和 KEYDATA 结构:
typedef strut
{
STRINGDATA key;
STRINGDATA ver;
} KEYDATA;