代码之家  ›  专栏  ›  技术社区  ›  Andy

将c传递给delphi dll的tstringlist

  •  2
  • Andy  · 技术社区  · 17 年前

    我有一个Delphi DLL,函数定义如下:

    函数submitJobStringList(jobList:tstringList;var jobNo:integer):integer;

    我是C打来的。如何将第一个参数声明为tstringlist在c中不存在。我现声明如下:

    [DllImport("opt7bja.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
    public static extern int SubmitJobStringList(string[] tStringList, ref int jobno);
    

    但当我调用它时,会得到一个内存访问冲突异常。

    有人知道如何正确地从C传递到t字符串列表吗?

    7 回复  |  直到 17 年前
        1
  •  13
  •   OregonGhost    17 年前

    你很可能不会有任何运气。tstringlist不仅仅是一个数组,它是一个完整的类,具体的实现细节可能与.NET不同。看看DelphiVCL源代码(也就是说,如果你有它的话),试着找出你是否可以在C中重建类,并在你最好的朋友interop marshaller的帮助下传递它。请注意,即使Delphi字符串类型与.NET字符串类型也不同,并且在传递它时不告诉封送处理程序他应该做什么,很可能他会将它作为char数组传递。

    除此之外,我建议更改delphi dll。在非Delphi客户机使用的dll中公开任何特定于Delphi的内容从来不是一件好事。将参数设为pchar数组,这样就可以了。

        2
  •  2
  •   Bruce McGee    17 年前

    如果这是您的dll,我将重写函数以接受字符串数组。避免将类作为dll参数传递。

    或者,如果你 真的? 出于某种原因,想要使用tstringlist,Delphi的vcl.net可以从任何.NET语言中使用。

    使用tinifile的旧示例: http://cc.codegear.com/Item/22691

    该示例在Delphi2005中使用.NET 1.1。Delphi 2006和2007支持.NET 2.0。

        3
  •  1
  •   Bruce McGee    17 年前

    如果您不控制DLL,并且它们不能或不会更改它,那么您总是可以在一个单独的DLL中编写自己的Delphi包装器,其中的参数更加跨语言友好。

    将类作为dll函数的参数是不正确的形式。

        4
  •  0
  •   Hemant    17 年前

    我不太清楚你使用delphi和c的方式。您似乎创建了一个要从C_调用的win32 dll。当然,你一定是在用宾沃克。

    我建议您使用源代码创建.NET DLL,因为VCL的完整端口可用。如果你愿意的话,我可以再详细说明一下……

        5
  •  0
  •   Mihai Limbășan    17 年前

    理论上,你 能够 通过使用指针(将它们强制转换为c intptr类型)而不是强类型的对象引用(或者将它们包装在其他类型中以避免声明不安全的块),可以做到这一点,但最重要的一点是:delphi运行时必须是为对象分配和释放内存的机制。为此,必须在Delphi编译的dll中声明函数,该dll调用tstringlist类的构造函数和析构函数,必须确保Delphi dll使用sharemem单元,并且必须在Delphi注册表离开dll和输入后,最好也作为从DelphiDLL导出的函数。

    简而言之,这是一个 许多 因为您必须在同一进程中同时处理两个内存管理器(.NET CLR和Delphi的分配器),并且必须手动管理内存。 “愚弄”Delphi内存管理器和运行时。是否有特定原因将您绑定到此设置?你能描述一下你想在更高层次上解决的问题吗?

        6
  •  0
  •   Shunyata Kharg    17 年前

    正如Hemant Jangid所说,通过将代码编译为.NET DLL,然后在C项目中引用该程序集,您应该能够轻松地做到这一点。

    当然,只有在Delphi.net版本中有Delphi.net的情况下,您才能这样做。

        7
  •  0
  •   unknown (yahoo)    17 年前

    我对C不太了解,但我用于跨上下文传输字符串列表的技术是使用.text属性获取表示列表的字符串,然后在“另一面”上分配该属性。

    通常在墙上挂一根绳子比较容易,因为它是一个完全爆炸的物体。

    推荐文章