My C# project have to refer a C++ dll,
SetConfig() in struct is my target, the head look like
extern "C"
{
int HSAPI GetSDKVersion();
IHsFutuComm* HSAPI NewFuCommObj(void* lpReserved = NULL);
struct IHsFutuComm:public IHSKnown
{
virtual int HSAPI SetConfig(const char* szSection,const char* szName,const char* szVal) = 0;
...
}
}
And C# look like
class Program
{
[DllImport("kernel32.dll")]
private static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
public delegate Int32 GetSDKVersion();
public delegate IntPtr NewFuCommObj(IntPtr lpReserved);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct IHsFutuComm
{
[MarshalAs(UnmanagedType.FunctionPtr)]
public SetConfig pSetConfig;
}
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate Int32 SetConfig(string szSection, string szName, string szVal);
static void Main(string[] args)
{
var pDll = LoadLibrary("HsFutuSDK.dll");
var pGetSDKVersion = GetProcAddress(pDll, "GetSDKVersion");
var dGetSDKVersion = (GetSDKVersion)Marshal.GetDelegateForFunctionPointer(pGetSDKVersion, typeof(GetSDKVersion));
var sdkVersion = dGetSDKVersion();
if (sdkVersion == 0x10000019)
{
var pNewFuCommObj = GetProcAddress(pDll, "NewFuCommObj");
var dNewFuCommObj = Marshal.GetDelegateForFunctionPointer(pNewFuCommObj, typeof(NewFuCommObj)) as NewFuCommObj;
var pIHsFutuComm = dNewFuCommObj(IntPtr.Zero);
var IHsFutuComm1 = (IHsFutuComm)Marshal.PtrToStructure(pIHsFutuComm, typeof(IHsFutuComm));
//error here
var re = IHsFutuComm1.pSetConfig("futu", "server", "127.0.0.1:2800");
}
}
}
The error at last line is "Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
How to call SetConfig() by C# ?
In this SetConfig is a (pure) virtual memberfunction of the struct, so the calling convention should be a thiscall , and the function pointer is not held inside the struct like in your C# code, but in it's vtable.
The declaration of the struct in the c++ code is probably more like an interface in C# than a struct in C#.
I'm sorry I can't give a complete answer, but I hope this will point you in the right direction.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.