none
.net调用未知的dll文件,有源代码 RRS feed

  • 问题

  • 已知以下vb6.0的代码可以正常使用该call.dll文件。

    Type CurCallNum
       CallerNum(15) As Byte
       CalledNum(15) As Byte
       OldCalledNum(15) As Byte
    End Type

    Public Declare Function GetCallData Lib "call.dll" (ByRef pCurNum As CurCallNum) As Byte
    Public Declare Function GetAgentStatus Lib "call.dll" (ByRef Status As Byte) As Byte
    现在需要把它移植到c#中,以下是我写的代码,运行时报错(应用程序遇到问题,我们对此表示抱歉!)



    [StructLayout(LayoutKind.Explicit, Size=48, CharSet=CharSet.Ansi)]
    public struct CurCallNum
    {
    [FieldOffset(0)]
    public byte[] CallerNum;
    [FieldOffset(16)]
    public byte[] CalledNum;
    [FieldOffset(32)]
    public byte[] OldCalledNum;
    }

    [DllImport("call.dll")]
    public static extern byte GetCallData(ref CurCallNum pCurNum);

    [DllImport("call.dll")]
    public static extern byte GetAgentStatus(ref byte Status);

    运行时报错, 请问一下应该如何修改?

    2010年5月9日 3:03

答案


  • [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct CurCallNum {
        
        /// byte[15]
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=15, ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]
        public byte[] CallerNum;
        
        /// byte[15]
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=15, ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]
        public byte[] CalledNum;
        
        /// byte[15]
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=15, ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]
        public byte[] OldCalledNum;
    }



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年5月12日 20:05
    版主
  • 你好

     建議你參考下這篇文章或許會對你有幫助 http://msdn.microsoft.com/zh-cn/library/tt0cf3sx(VS.80).aspx


    I see you~http://hi.baidu.com/1987raymondMy Blog~~~
    2010年5月10日 12:49
    版主

全部回复

  • 你好

     建議你參考下這篇文章或許會對你有幫助 http://msdn.microsoft.com/zh-cn/library/tt0cf3sx(VS.80).aspx


    I see you~http://hi.baidu.com/1987raymondMy Blog~~~
    2010年5月10日 12:49
    版主

  • [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct CurCallNum {
        
        /// byte[15]
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=15, ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]
        public byte[] CallerNum;
        
        /// byte[15]
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=15, ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]
        public byte[] CalledNum;
        
        /// byte[15]
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=15, ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]
        public byte[] OldCalledNum;
    }



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年5月12日 20:05
    版主