帮助在Delphi中为C构建一个Dll

时间:2010-10-04 14:41:36

标签: c delphi dll

我之前已经问过another questions关于构建我的dll的问题,但它接近它的方向错误:)所以我已经重新制定并解释了更多她。

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

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

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

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

DLL:

//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.

Delphi app:

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

5 个答案:

答案 0 :(得分:4)

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

我建议采用略有不同的方法。在DLL中有一个名为SendStringFromCApp的函数和一个名为GetStringIntoDelphiApp的函数(或者适当的函数)。

C程序将正常加载DLL的副本并调用SendStringFromCApp函数。此函数将以一些常见的中间格式(例如简单数据库)存储传入的数据。它会将存储视为一种队列,只需将数据添加到此队列即可。数据库是最明显的选择,但它可以像公共目录一样简单,数据存储为小文本文件,文件名越来越大。

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

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

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

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

答案 1 :(得分:2)

答案 2 :(得分:1)

尝试实施IPC(进程间通信)。您将有3个独立的进程。

  1. Delphi exe
  2. Ths C program
  3. 非窗口进程(com服务,exe,...)
  4. 使用非窗口作为服务器,另外2个是客户端。 有关Delphi中的IPC的this和有关C的IPC的this,请参阅IPC的方法有很多种。如果你在你最喜欢的搜索引擎中寻找IPC,我很确定你会找到一种为C和Delphi做IPC的常用方法,因为它只是一些win32 api芭蕾舞。

答案 3 :(得分:1)

正如loursonwinny所说,IPC是要走的路 您应该了解每个DLL都在单个应用程序的地址空间中加载。因此,Delphi和C应用程序使用的DLL将在内存中存在两次。 (好吧,不完全,代码部分是共享的,DLL中的所有数据都存在两次。)所以基本上你的DLL不能简单地在两个进程之间共享数据。
当然也有例外。例如,可以在单个DLL中创建键盘钩子,该DLL在Delphi应用程序中加载,然后注入到C进程的地址空间。然后DLL可以“窥视”C应用程序的内存空间并捕获一些信息。 (键盘事件与KeyHooks。)但KeyHooks和类似的注射DLL将被平均防病毒产品注意为“坏”。并且有充分的理由,因为这是您对计算机病毒所期望的行为 另一种解决方案是使用memory mapped file而不是IPC。有几个组件可用作开源或商用,但您也可以使用Windows API创建这些组件 Windows API还提供了命名管道和MailSlots等技术,这些技术也可用于进程间通信。它不需要是TCP / IP,但是您需要某种方式让两个进程相互通信。这个逻辑确实可以构建在一个DLL中,您只需要定义两个方法。一个用于服务器,一个用于客户端。不过,这是一项复杂的技术。 Delphi 5有点旧,所以我不知道哪种解决方案最适合你。

答案 4 :(得分:0)

DLL必须回调到Delphi程序。当Delphi程序启动时,它将注册一个回调函数。然后,DLL知道C程序调用时要调用的内容。

实施例: http://delphi.about.com/od/windowsshellapi/a/callback_delphi.htm 此示例使用回调来允许Windows API回调到您的delphi应用程序。同样的想法,但不是Windows API,你将被自己的DLL调用。