Выполнение процедур из другого приложения.
От: Аноним  
Дата: 10.06.04 00:44
Оценка:
Доброго всем времени суток, у меня появился вопрос о том как выполнить из Dll-библиотеки запускаемой моей программой функцию или процедуру которая находится в программе. а также как выполнить процедуру находящуюся в главном файле "*dpr" из модуля этой же программы. что то бился целый день но ничего не вышло, кто знает подскажите плз.
Заранее спасибо.
Re: Выполнение процедур из другого приложения.
От: Nuald Россия http://nuald.blogspot.com
Дата: 10.06.04 00:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доброго всем времени суток, у меня появился вопрос о том как выполнить из Dll-библиотеки запускаемой моей программой функцию или процедуру которая находится в программе. а также как выполнить процедуру находящуюся в главном файле "*dpr" из модуля этой же программы. что то бился целый день но ничего не вышло, кто знает подскажите плз.


Если позволяет архитектура, то можно просто использовать сообщения, например, функцию PostThreadMessage.
Если нет, то можно использовать callback-функции — скажем в DLL определить функцию инициализации:
typedef void (*func_prototype)();
func_prototype func_pointer;
void InitCallbacks(func_prototype* f) {
  func_pointer = f;
}


а в главной программе ее вызвать:
void func() {...}
...
InitCallbacks(func);


Есть и другие способы — все зависит от архитектуры приложения...
Re[2]: Выполнение процедур из другого приложения.
От: vasko  
Дата: 10.06.04 01:33
Оценка:
Здравствуйте, Nuald, Вы писали:
дело в том что я пишу на делфях и не знаком с си++
ф структура вызова длл следующая: вызываем из *.dpr файла и ставим обработчик событий

procedure ShowDLLForm(hWnd: THandle);
type
  // Прототип функции из DLL. Напрямую написать Uses нельзя, т.к.
  // при этом в проект скомпилируется и форма.
  TDoDLLForm = function (lpNewHint: PChar; iSize: Integer): Boolean; stdcall;
const
  FormRunning: Boolean = FALSE;
  // Флаг "Форма загружена". Для предотвращения повторной загрузки
  // формы
var
  hDLL: THandle;
  DoDLLForm: TDoDLLForm;
  Buffer: array[0..50] of Char;
begin
  if FormRunning then
    Exit;
  hDLL := LoadLibrary('resurs.dll');
  if hDLL = 0 then
    MessageBox(0, 'No library resurs.dll found', NIL, MB_OK)
  else begin
    DoDLLForm := GetProcAddress(hDLL, 'DoDLLForm');
    if Assigned(DoDLLForm) then begin
      try
        lstrcpy(Buffer, Hint);
        // Функции StrCopy требуют uses SysUtils, что сразу
        // увеличивает EXE файл на 25 Кбайт. Используем API
        // аналоги
        if DoDLLForm(@Buffer, SizeOf(Buffer)) then begin
          lstrcpy(Hint, Buffer);
          TaskBarModifyIcon(hWnd, 1, NIF_TIP, 0, Hint);
        end;
      finally
      end;
    end;
  end;
  FreeLibrary(hDLL);
end;

обработчик событий:

[pascal]

  Application.Initialize;
  dm:=Tdm.Create(nil);
  ShowWindow(hWnd, SW_HIDE);
  Application.Run;
  // Цикл обработки сообщений
  while GetMessage(Msg, 0, 0, 0) do begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;


[/pascal]
Re[3]: Выполнение процедур из другого приложения.
От: Nuald Россия http://nuald.blogspot.com
Дата: 10.06.04 01:43
Оценка:
Здравствуйте, vasko, Вы писали:

V>дело в том что я пишу на делфях и не знаком с си++


Я лишь обрисовал принцип, на чем реализовывать — не важно

V>ф структура вызова длл следующая: вызываем из *.dpr файла и ставим обработчик событий


Так в чем проблема? Из DoDLLForm вызывать функции проекта? Так и делать, как я описал — либо через сообщения, либо через callback-функции. Единственное, я не помню как на дельфях это делать, не охота ставить... ИМХО Дельфи годится только для написания прототипов...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.