title: How to call a function in struct from C++ dll by C#
body: <p>My C# project have to refer a C++ dll,</p>
  
  <p>SetConfig() in struct is my target, the head look like</p>
  
  <pre><code>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;
          ...
      }
  }
  </code></pre>
  
  <p>And C# look like</p>
  
  <pre><code>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");
          }
      }
  }
  </code></pre>
  
  <p>The error at last line is "Attempted to read or write protected memory. This is often an indication that other memory is corrupt."</p>
  
  <p>How to call SetConfig() by C# ?</p>