c - 帮助在 Delphi 中为 C 构建 Dll

标签 c delphi dll

我以前问过 another questions关于构建我的 dll,但它看起来像是朝着错误的方向前进:) 所以我重新制定并向她解释了更多。

所以我试图构建的是一个 dll,它将用作我的 delphi 程序和其他人的 C 程序之间的接口(interface)。

这个 dll 必须做的是从 C 程序接收一个字符串,然后将它发送到 delphi 程序,在那里它将与一些数据组合并存储在我程序的当前用户下。

如何在我的 Delphi 程序(运行程序)中调用一个方法来存储来自 dll 的消息?

我使用的是 Delphi 5。 这是我到目前为止得到的:

动态链接库:

//Parent application: MyDelphiApp   
library MyDllLink; 

uses
  ShareMem,
  SysUtils,
  Classes,
  Dialogs,
  Main;// Main is a form from my delphi app. This is not allowed/recomended ?

{$R *.RES}


procedure Transfer(sMessage: PChar); stdcall;
begin
    try
        //If including Main in the uses clause, then this will also be wrong:
        MainForm.StoreDllMessage(sMessage);
    except
        showmessage('Error');
    end;    
end;

exports
Transfer;

end.

德尔福应用程序:

procedure TMainForm.StoreDllMessage(sMessage: String);
begin
    //StoreMessage just stores it in a DB
    StoreMessage(sMessage +' '+sCurrentUserName);
end;

最佳答案

我可能理解错了,但您似乎希望 C 程序和 Delphi 程序同时加载相同的 DLL 副本。你不能那样做,只能通过涉及进程间通信的大量工作才能真正实现它。应用程序将具有独立的进程空间和内存。

我会建议一种稍微不同的方法。在 DLL 中有一个名为 SendStringFromCApp 的函数和一个名为 GetStringIntoDelphiApp 的函数(或其他合适的函数)。

C 程序将正常加载 DLL 的副本并调用 SendStringFromCApp 函数。该函数会将传入的数据以某种通用的中间格式(例如简单的数据库)进行存储。它将存储视为一种队列,并简单地将数据添加到该队列中。数据库是最明显的选择,但它可以像普通目录一样简单,并且数据存储为小文本文件,文件名是递增的整数。

Delphi 程序将加载自己的 DLL 副本并调用 GetStringIntoDelphiApp,后者将从队列/内部存储中读取第一项并根据需要对其进行处理并将其从存储中删除。然后它将读取下一个等等。

这样做的好处是 C 和 Delphi 应用程序都可以独立运行。只有 DLL 需要通用配置,即使 Delphi 应用程序未运行,C 程序也可以继续工作,反之亦然。

它基本上是一个用于独立进程的生产者-消费者排队系统。

就像我说的,我可能误解了要求!

关于c - 帮助在 Delphi 中为 C 构建 Dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3856288/

相关文章:

delphi - 如何从 VB6 调用 Delphi DLL

关闭 C 程序前的确认

delphi - 从 Word OLE 应用程序对象获取应用程序标题

c++ - 函数名称与序数值 - 从 DLL 模块获取函数地址

c# - 命名空间 'Transactions' 中不存在类型或命名空间名称 'System'(是否缺少程序集引用?)- C# ASP.NET

delphi - 日期/时间操作 - 友好的倒计时字符串

c - .lib 中的符号在 .so 中不存在

c - Linux 内核中的内存映射 - vamlloc() 和 kmalloc() 的使用

c - 格式 '%lf' 需要类型为 'double' 的参数,但参数 2 的类型为 'double *'

Delphi 10.x "Cannot resolve unit name"用于新安装的库