在所写的C#中要调用一别人开发的API,此API定义如下:本API为DELPHI开发的Windows平台DLL动态库,接口声明语法为Object Pascal
ObjectPascal与C的接口声明语法对照如下:
pchar 对应 char*
interger 对应 int
var integer 对应 int *
          byte 对应 charfunction InitializeEsm(Esmser,Webser:pchar;SetTcp,Deliver:integer):integer; 
C语法声明:
int InitializeEsm( char *Esmser,
char *Webser,
char *SocksPxy,
int SetTcp,
int Deliver)
我在C#里是这样用的,但是肯定是错误的,请教正确用法!
       [DllImport("Es.dll")]   //Es.dll为所调用api
       public static extern int InitializeEsm(string Esmser,string Webser,int SetTcp,int Deliver);程序完整代码如下:
using System;
using System.Runtime.InteropServices;    class MessageSend
    {
        [DllImport("Es.dll")]
        public static extern int InitializeEsm(string Esmser,string Webser,int SetTcp,int Deliver);
         public static void Main()
        {
           
                  int iRes=InitializeEsm("123","456",0,0);
    Console.WriteLine(iRes);        }
    }编译通过,但在程序运行时出错。

解决方案 »

  1.   

    另外想问问我如何调用API中的涵数呀。这个问答了也照给分!
      

  2.   

    Have a try!如果只是传进的话,可以如下
    [DllImport("Es.dll")] 
    public static extern int InitializeEsm(
      [MarshalAs( UnmanagedType.LPTStr )]string Esmser,
      [MarshalAs( UnmanagedType.LPTStr )]string Webser,int SetTcp,int Deliver);如果是需要传出的话,可以如下
    [DllImport("Es.dll")] 
    public static extern int InitializeEsm(
      [MarshalAs( UnmanagedType.LPTStr )]StringBuilder Esmser,
      [MarshalAs( UnmanagedType.LPTStr )]StringBuilder Webser,int SetTcp,int Deliver);Caution:
    使用的时候,需要给参数初始化空间,例如:
    StringBuilder Esmser = new StringBuilder( 256 );
      

  3.   

    此问题已解决,用C++捕捉到API有问题。