【问题标题】:calling Delphi function from SphinxC--从 SphinxC 调用 Delphi 函数——
【发布时间】:2015-10-30 14:06:15
【问题描述】:

我有一个这样声明的 Delphi 函数

function strcspn(s1, s2: PAnsiChar): Cardinal;  cdecl;

我想从 SphinxC-- 中调用它,问题是 SphinxC-- 需要 strcspn 的名称而无需任何修饰。

那么如何强制 Delphi 在 obj 文件中设置?

我会问的更详细的。

我使用的是 SphinxC-- 语言,你可以认为它是 Masm 汇编器和 c 语言的混合体。它可以产生OMF文件格式。

我通过链接使用 SphinxC 编译的代码和使用 bcc32(c++Builder 编译器)编译的代码,成功地将它与 C++Builder 混合。通过在 c++ 代码中使用 extern "C" 术语来告诉 bcc32 未修改函数名,也使用 -u- (bcc32 命令行 otpion) 来告诉 bcc32 在没有前缀下划线的情况下预测函数名。

现在我有一些 delphi 代码,我想将它与我的 SphinXC- 代码混合, 就像我对 c++Builder 所做的一样。

所以我的问题是如何强制 delphi 编译器 dcc32 预测未修改的函数名称?

再次编辑:

这是我对 bcc32、dcc32、ilink32 的推荐行

适用于 dc32

dcc32.exe -DMSWINDOWS -JPHNE -I"mypath/include" -U"mypath\lib" -U"mypath\units"  mfiley.pas

为密件抄送32

bcc32.exe -u- -DDEBUG;NO_STRICT -D_RTLDLL;USEPACKAGES  -k  -c -tWM -v- -Vw  -W- -Par -M -Hc -P myfile.cpp

ilink32

ilink32 -v -Gn -G8 ........ etc

【问题讨论】:

  • 什么是 SphinxC--?我怀疑您是否可以期望将 Delphi 代码编译成目标文件并静态链接它。 strcspn 是一个 C 标准库函数。为什么要在 Delphi 中实现它?简而言之,您似乎没有清楚地了解自己在做什么,并且您当然没有就这个问题传达任何可回答的内容。请在编辑中努力清楚地表达您在做什么,以及您的问题是什么。
  • 好的,大卫,我正在尝试混合我最好的编程语言 SphinxC——并将其扩展为使用 C++Builder 、 Delphi 和它的 lnker。 SphinxC-- 是 c 和 asm 的中间点。所以我可以通过使用 extern "C" term 和 -u-commend 行选项来调用 C++Builder 函数,我的问题是如何使用 Delphi 来预测未损坏的函数名称,希望现在很清楚。请问有什么帮助吗?
  • 连远程都不清楚。请不要在 cmets 中提问。请编辑问题以明确您的要求。
  • 还远未弄清楚。 Delphi 编译器不是 bcc32。那就是 C++ Builder 编译器。请您认真注意细节。
  • @Jens 这有什么帮助?

标签: delphi delphi-2009


【解决方案1】:

我的问题是如何强制 Delphi 编译器 dcc32 生成未损坏的函数名称?

这是不可能的。如果您希望获得未损坏的函数名称,则需要使用 objconv 之类的工具在编译后修改名称。

一个更大的问题是,任何严肃的真实世界的 Delphi 代码都需要 Delphi RTL,我认为您能够将其静态链接到您的 C++ 项目的希望很小。实际上,在同一个模块中混合 C++ 和 Delphi 代码需要一个对两种语言都有深入了解的工具,而该工具就是 C++-Builder。

【讨论】:

    【解决方案2】:

    已经有了 C++Builder ,所以在 C++ 中使用 Delphi 单元非常容易。我会尝试使用 objconv。我的最后一个解决方案是从 C++Builder 辅助函数中调用 delphi 的东西。

    类似的东西

    德尔福端 函数 DelhpFunc(s1, s2: PAnsiChar): 整数; cdecl; ...... ......

    C++Builder端

    包括<..hpp> Delphi 制作的头文件

    外部“C” { __declspec(naked) int helperFunc()
    { 汇编{ jmp DelhpFunc } } };

    SphinxC-- side extern int cdecl helperFunc(char* s1,char* s2); main() { helperFunc("hello","there"); }

    【讨论】:

    • 这似乎与所提出的问题无关。回顾一下,问题是:我的问题是如何强制 Delphi 编译器 dcc32 生成未损坏的函数名称?请您尝试回答所提出的问题。
    • 好的,当我问我的问题时,我的意图是强迫 Dlphie 预测未损坏的名称,以便我以后可以轻松地从 SphinxC 调用该函数-,由于没有未损坏名称的选项,我发现以上解决我的问题,可能对其他人有用。
    • 这不是解决您的问题。这是关于回答所提出的问题。请阅读help center。如果您参与得更多,那么我们会更愿意为您付出更多努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    相关资源
    最近更新 更多