Помогите построить Dll для C в Delphi - PullRequest
0 голосов
/ 04 октября 2010

я ранее задавал другие вопросы о построении моей dll, но она кажется, будто она движется в неправильном направлении :) Так что я переформулировал и объяснил больше ее.build - это dll, которая будет работать как интерфейс между моей программой delphi и чьей-то другой программой на C.

Что эта dll должна сделать, это получить строку из программы на C, а затем отправить ее в программу 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:

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

Ответы [ 5 ]

4 голосов
/ 04 октября 2010

Возможно, я неправильно это понимаю, но кажется, что вы хотите, чтобы одна и та же копия DLL загружалась одновременно и программой C, и программой Delphi. Вы не можете сделать это и можете действительно достичь этого, используя большую работу, включающую межпроцессное взаимодействие. Приложения будут иметь отдельное пространство процесса и память.

Я бы предложил немного другой подход. В DLL есть функция с именем SendStringFromCApp и функция с именем GetStringIntoDelphiApp (или что-то подходящее).

Программа на C загрузит копию DLL как обычно и вызовет функцию SendStringFromCApp. Эта функция будет хранить переданные данные в некотором общем промежуточном формате (например, в простой базе данных). Он будет рассматривать хранилище как своего рода очередь и просто добавлять данные в эту очередь. База данных является наиболее очевидным выбором, но она может быть такой же простой, как и общий каталог, и данные хранятся в виде небольших текстовых файлов с возрастающим целым числом в качестве имени файла.

Программа Delphi загрузит свою собственную копию DLL и вызовет GetStringIntoDelphiApp, которая будет считывать первый элемент из очереди / внутреннего хранилища, обрабатывать его по мере необходимости и удалять из хранилища. Затем будет прочитано следующее и т. Д. И т. Д.

Преимущество этого заключается в том, что приложения C и Delphi могут работать независимо друг от друга. Только DLL нужна общая конфигурация, и программа на C может продолжать работать, даже если приложение Delphi не запущено, и наоборот.

По сути, это система массового обслуживания производителей и потребителей для отдельных процессов.

Как я уже сказал, возможно, я неправильно понял требования!

2 голосов
/ 05 октября 2010

Для самого простого IPC попробуйте WM_COPYDATA с PostMessage или SendMessage
Документ Microsoft:
http://msdn.microsoft.com/en-us/library/ms649011%28VS.85%29.aspx

Образец Microsoft:
http://msdn.microsoft.com/en-us/library/ms649009%28v=VS.85%29.aspx

и многое другое в Google:
http://www.google.com/search?q=WM_COPYDATA&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:pt-BR:official&client=firefox-a

1 голос
/ 05 октября 2010

Как говорит Лурсонвинни, IPC - это путь.
Вы должны понимать, что каждая DLL загружается в адресном пространстве одного приложения. Таким образом, DLL, которая используется Delphi и приложением C, будет существовать два раза в памяти. (Ну, не полностью, разделы кода являются общими, все данные в DLL существуют дважды.) Таким образом, в основном ваша DLL не может просто обмениваться данными между двумя процессами.
Конечно, есть исключения. Например, клавиатурный хук может быть создан в одной DLL, которая загружается в ваше приложение Delphi, а затем вводит в адресное пространство процесса C. Затем DLL может «заглянуть» в область памяти приложения C и получить некоторую информацию. (События клавиатуры с KeyHooks.) Но KeyHooks и аналогичные DLL для инъекций будут замечены средними антивирусами как «плохие». И на то есть веская причина, потому что такого поведения можно ожидать от компьютерного вируса.
Другим решением вместо IPC было бы использование отображенного в память файла . Есть несколько компонентов, доступных как с открытым исходным кодом, так и на коммерческой основе, но вы также можете использовать Windows API для их создания.
Windows API также предоставляет такие методы, как именованные каналы и почтовые слоты, которые также можно использовать для межпроцессного взаимодействия. Это не обязательно должен быть TCP / IP, но вам нужно будет каким-то образом связать два процесса друг с другом. И эта логика действительно может быть встроена в одну DLL, где вы определяете только два метода. Один для сервера, один для клиента. Это сложная техника, хотя. А Delphi 5 немного устарел, поэтому я не знаю, какое решение подойдет вам лучше.

1 голос
/ 05 октября 2010

Попробуйте реализовать IPC (InterProcess Communication). У вас будет 3 отдельных процесса.

  1. Delphi exe
  2. Эта программа на С
  3. Неоконный процесс (com service, exe, ...)

Использовать неоконный сервер в качестве сервера, остальные 2 являются клиентами. См. this для IPC в Delphi и this для IPC в C. Существует множество способов сделать IPC. Если вы ищете IPC в вашей любимой поисковой системе, я уверен, что вы найдете общий способ сделать IPC для C и Delphi, потому что это всего лишь какой-то win32 api балет.

0 голосов
/ 04 октября 2010

DLL должна вызывать программу Delphi. Когда программа Delphi запускается, она регистрирует функцию обратного вызова. Затем DLL знает, что вызывать, когда она вызывается программой на Си.

Пример: http://delphi.about.com/od/windowsshellapi/a/callback_delphi.htm В этом примере используется обратный вызов, чтобы позволить Windows API перезвонить в ваше приложение delphi. Та же идея и здесь, но вместо Windows API вам будет вызываться ваша собственная DLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...