代码之家  ›  专栏  ›  技术社区  ›  Casperonian

C++对本地C++ DLL的访问

  •  0
  • Casperonian  · 技术社区  · 6 年前

    我正在尝试创建一个访问本地C++ DLL的程序。下面是示例代码。

    C++代码

    GetRmaPin (const char *rma_password, const char *serial, unsigned char *rma_pin);
    

    C代码

    class Program
    {
        static void Main ( string [ ] args )
        {
            string[] password = { "74f3d3a287cee548c1842c07090d6a274dd0ddbd04bfd1e4694861a369bc7304" };
            string[] serial = { "184393900006" };
            //StringBuilder rma_pin = new StringBuilder(2048);
            byte[] rma_pin = new byte[2048];
    
            int rc = GetRmaPin(password, serial, ref rma_pin);
            Console.WriteLine ( "Result: " + rc.ToString ( ) );
            Console.WriteLine ( "Payload: " + rma_pin.ToString ( ) );
            Console.Read ( );
        }
    
        [DllImport ( "Security.dll" , EntryPoint = "GetRmaPin" , CallingConvention = CallingConvention.Cdecl)]
        public static extern int GetRmaPin (
            [In][MarshalAs ( UnmanagedType.LPArray , ArraySubType = UnmanagedType.LPStr )] string [ ] password ,
            [In][MarshalAs ( UnmanagedType.LPArray , ArraySubType = UnmanagedType.LPStr )] string [ ] serial ,
            ref byte[] rmap_in );
    }
    

    错误消息: 托管调试助手“fatalExecutionEngineerRor” message=managed debugging assistant'fatalExecutionEngineerRor':'运行时遇到致命错误。错误的地址是0x732DC93D,在线程0x97A4上。错误代码为0xC0000005。此错误可能是CLR或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括用户对COM互操作或PInvoke的封送处理错误,这可能会损坏堆栈。

    0 回复  |  直到 6 年前
        1
  •  0
  •   Casperonian    6 年前

    我找到了一种方法,通过一些实验从第三个参数中获取值。这是更新后的代码。感谢@hanspasant提供删除“ref”的提示。希望这对以后的人有帮助。

    class Program
    {
        static void Main ( string [ ] args )
        {
            string[] password = { "74f3d3a287cee548c1842c07090d6a274dd0ddbd04bfd1e4694861a369bc7304" };
            string[] serial = { "184393900006" };
            byte[] rma_pin = new byte[32];
    
            int rc = GetRmaPin(password, serial, rma_pin);
    
            Console.WriteLine ( "Result: " + rc.ToString ( ) );
            Console.WriteLine ( "Payload: " + BitConverter.ToString ( rma_pin ).Replace ( "-" , "" ) );
            Console.Read ( );
        }
    
        [DllImport ( "SecurityProduction.dll" , EntryPoint = "GetRmaPin" , CallingConvention = CallingConvention.Cdecl)]
        public static extern int GetRmaPin (
            [In][MarshalAs ( UnmanagedType.LPArray , ArraySubType = UnmanagedType.LPStr )] string [ ] password ,
            [In][MarshalAs ( UnmanagedType.LPArray , ArraySubType = UnmanagedType.LPStr )] string [ ] serial ,
            byte[] rmap_in );
    }