p1 = System.Runtime.InteropServices.Marshal.AllocHGlobal(260)
        s1 = System.Runtime.InteropServices.Marshal.PtrToStringUni(p1)
        System.Runtime.InteropServices.Marshal.FreeHGlobal(p1)枚举类型应该有一个固定的数值

解决方案 »

  1.   

    我以前调用别的语言的dll时,参数的类型会搜一下对应当前语言的替换类型,一般都可以对应到的
      

  2.   

    谢谢楼上几位的回答,枚举已经搞定,指定为byte且给出明确值即可。但第二个问题还是不行,@caozhy, 就像你说的不需要清空内存,确实是这样,我在delphi的dll里去掉ZeroMemory就好了。
    这个我之前也试出来了,但是我的问题在于,我不能改动delphi的dll,一切都是基于dll写c#的代码并且完美调用。你们还是什么意见吗?
      

  3.   

    再补充一下,我通过调试dll,发现ZeroMemory错了,是因为:var
      cOutBufferSize, cAPIBufferSize, cApiBufferBlockSize: Cardinal;cOutBufferSize := StrBufSize(OutBuffer);
    ZeroMemory(OutBuffer, cOutBufferSize);cOutBufferSize这个size用StrBufSize老是取不对,我在c#里无论传Stringbuilder(已设置好容量)还是IntPtr(已分配好内存),传到delphi里用StrBufSize取,都是一个固定的值:67108860
      

  4.   

    定义string,并且制定长度就行。或者试试out char[]看看。
      

  5.   

    这个PChar类型的参数其实是做内存块用的,如果是delphi自己调用的话,在调用前,我会用StrAlloc函数分配固定大小的内存
    cOutBufferSize := StrBufSize(OutBuffer);
    这种dll不标准啊,怎么跨平台用
      

  6.   

    To mjp1234airen4385, string 和 char[]都试了,不行。IntPtr 也试了,加不加ref 也都试了,不行。To wy24789, delphi的dll早就存在了,并且很多,也不能改。当时也不会想到现在要用c# 调。
      

  7.   

    可能需要
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
    public char[] 参数;
    或者
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    public string 参数;
      

  8.   

    在导入函数的时候指定参数的封送方式
    [DllImport(XXX)]
    static void 函数名([MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] string 参数名)
      

  9.   

    谢谢各位,最后用byte[]解决。结贴