日期:2014-05-17  浏览次数:20873 次

求一个DLL接口写法,万分感谢
第一次搞第三方DLL接口程序,很多地方不太会,求教,我的代码如下:

  [DllImport("TPBroker.dll", EntryPoint = "RTPC", CharSet = CharSet.Ansi)]

  public static extern int RTPC(int TPID, Char[] AuthorizedCode, Char[] RequestCode, Char[] RequestParams, ref Char[] ResponseCode, ref int[] ResponseBufLen, ref Char[] ResponseParams);

  public Form1()
  {
  InitializeComponent();
  }
   
  private void button1_Click(object sender, EventArgs e)
  {
  char[] AuthorizedCode1 = "{[1106]|[SYSTEM]|[0]}".ToArray();
  char[] RequestCode1 = "{[0000]}".ToArray();
  char[] RequestParams1 = "{[2]}".ToArray();
  char[] ResponseCode1 = "{[]}".ToArray();
  int [] ResponseBufLen1 = {100};
  char[] ResponseParams1 = "{[]}".ToArray();

  try
  {
  textBox1.Text = RTPC(21, AuthorizedCode1, RequestCode1, RequestParams1, ref (ResponseCode1), ref (ResponseBufLen1), ref(ResponseParams1)).ToString();

  System.Text.StringBuilder sb1 = new System.Text.StringBuilder();
  sb1.Append(ResponseCode1);
  System.Text.StringBuilder sb2 = new System.Text.StringBuilder();
  sb2.Append(ResponseBufLen1);
  System.Text.StringBuilder sb3 = new System.Text.StringBuilder();
  sb3.Append(ResponseParams1);
  textBox2.Text = sb1.ToString();
  textBox3.Text = sb2.ToString();
  textBox4.Text = sb3.ToString();

  }
  catch (Exception ex)
  {
  MessageBox.Show(""+ex+"", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
  }
  }
点击后程序报错:
运行时遇到了错误。此错误的地址为 0x791c7b88,在线程 0x1194 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈
引发类型为“System.ExecutionEngineException”的异常

------解决方案--------------------
把你的第三方DLL的头文件贴出来,你的RTPC函数对于错误,在C#里面那么写100%错的,至少错误有2大类,第一是对数组绝对不能用ref关键字,传入的数组不论长度是多少,传出就变为长度为1的数组了;第二是C#的Char是2个字节,而C++或Delphi的本地语言中的Char都是单字节,长度不一样,所以从来不在接口函数的声明中用Char的。
------解决方案--------------------
这要看你的dll原型,如果原型中都是诸如 int* 之类的,可以直接传递 int[],别加ref试试