none
델파이 DLL 연동하기 RRS feed

  • 질문

  • 델파이 DLL을 C#에서 호출하는 기능을 테스트중입니다.

    아래와 같은 오류가 발생하는데, 이해가 안갑니다... C++과 델파이는 해본적이 없습니다.

    델파이 variant type은 c#의 object형이라고 해서

    다른 방법도 해보았지만 같은 오류가 발생합니다.

    해결할 수 있는 방법이 있을까요?

    *** 오류내용
    처리되지 않은 'System.Runtime.InteropServices.MarshalDirectiveException' 형식의 예외가 delphidll.exe에서 발생했습니다.
     
    추가 정보: 'parameter #3'을(를) 마샬링할 수 없습니다. 관리되는/관리되지 않는 형식 조합이 잘못되었습니다. Int/UInt는 SysInt 또는 SysUInt와 쌍이 되어야 합니다.

    ***********

    델파이 함수

    function UserChk(n1, n2:Pansichar; var out_usernm: variant):Integer;stdcall;
    begin
      out_usernm[0] := '11111' + '|' + 'AAAAA' + '|';
      out_usernm[1] := '22222' + '|' + 'AAAAA' + '|';
      out_usernm[2] := '333' + '|' + 'AAAAA' + '|';
      out_usernm[3] := '444' + '|' + 'AAAAA' + '|';
      out_usernm[4] := '555' + '|' + 'AAAAA' + '|';
      out_usernm[5] := '777' + '|' + 'AAAAA' + '|';
      out_usernm[6] := '666' + '|' + 'AAAAA' + '|';
      Result := 1;
    end;

    function Send_PACS_ExamInfo(
         in_patno
       , in_orddate
       , in_ordseqno
       , in_ordcd
       , in_pathno
       , in_userid : string
    ):string; stdcall;
    begin
      Result := in_orddate + '<===>' + '1234567890';
    end;

    ==========================
    C# 소스
       [DllImport("Math.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
       [return: MarshalAs(UnmanagedType.I4)]
       private static extern int UserChk(string s1, string s2
                , [MarshalAs(UnmanagedType.Struct)]
                  ref IntPtr usernm);
     
            [DllImport("Math.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
            [return: MarshalAsAttribute(UnmanagedType.LPWStr)]
            private static extern IntPtr Send_PACS_ExamInfo(
                string p1,
                string p2,
                string p3,
                string p4,
                string p5,
                string p6);
     
    [StructLayout(LayoutKind.Sequential)]
            public struct Variant
            {
                public ushort vt;
                public ushort wReserved1;
                public ushort wReserved2;
                public ushort wReserved3;
                public Int32 data01;
                public Int32 data02;
            }
     
     private void button1_Click(object sender, EventArgs e)
            {
                Variant pv = new Variant();
                IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(pv));
                VariantInit(ptr);
                Marshal.StructureToPtr(pv, ptr, false);
     
                //pv.vt = VT_BSTR ??????
                int iret = UserChk("111", "222", ref ptr); <--- 오류 발생
     
                object objRet = Marshal.GetObjectForNativeVariant(ptr);
                VariantClear(ptr);
                Marshal.FreeCoTaskMem(ptr);
                ptr = IntPtr.Zero;
     
                //string vv = new String('\x0000', 1024);
                //IntPtr value2 = (IntPtr)Marshal.StringToHGlobalUni(vv);
                string value = Send_PACS_ExamInfo("11", "22", "33", "44", "55", "66");  <-- 오류

    }



    • 편집됨 ydc1940 2018년 7월 3일 화요일 오전 5:49
    2018년 7월 3일 화요일 오전 5:47

답변