Показать сообщение отдельно
  #5  
Старый 14.08.2008, 14:04
dmdx dmdx вне форума
Начинающий
 
Регистрация: 24.05.2008
Адрес: Москва
Сообщения: 133
Репутация: 15
По умолчанию

Цитата:
Сообщение от Thrasher
Ну не так нужно делать!

Во-первых, нужно объявить нормально функции в секции exports:

Код:

exports
ShowMessage name 'ShowMessage', 
Summ name 'ShowMessage';

Во-вторых, правильное объявление должно быть:

Код:

type
  TSumm  =  function (x: integer; y: integer ): integer;stdcall;

  TShowMgs  =  procedure (text: string);stdcall; // Как в библиотеке объявлено так должно быть объявлено и в программе!!!


В-третьих правильный вызов:
Код:

procedure TForm1.Button2Click(Sender: TObject);
var
 dllHandle:  THandle;
 Sum: TSumm;
begin
 @Sum := nil;
 dllHandle := LoadLibrary(PChar('FunDll.dll'));
 if dllHandle < 32 then // Ошибок загрузки DLL 32 штуки!!
  exit;
 @Sum := GetProcAddress(dllHandle, PChar('Summ'));
 if @Summ  =  nil then
  exit;
 showmessage(inttostr(sum(4, 6)));
 FreeLibrary(dllHandle);
end;


с функцией сложение получилось спасибо понял в чем была ошибка, а вот с процедурой отображения текста все таже ошибка, но я думаю тут уже ошибка моя где то в самой процедуре. Хотя если статически загружить все отлично работает. пробывал вот так в dll
Код:
procedure ShowMessage(text: pchar); stdcall; export;
begin
 ShowMessage(text);
end;
и в модуле соответственно менял
Код:
 TShowMgs  =  procedure (text: pchar);stdcall;
...
procedure TForm1.Button2Click(Sender: TObject);
var
 dllHandle: THandle;
 ShowMsg:TShowMgs;
begin
@ShowMsg:=nil;
dllHandle:=LoadLibrary(PChar('FunDll.dll'));
if dllHandle<32 then
 exit;
@ShowMsg:=GetProcAddress(dllHandle,Pchar('ShowMessage'));
if @ShowMsg=nil then
 exit;
ShowMsg(pchar('Welcome'));
FreeLibrary(dllHandle);
end;

все равно ошибка. буду думать.
__________________
Програмист приходит на стрельбище. Стреляет. Прапор смотрит на мешень и говорит
Прапор: вы не попали ни один раз.
Программист: Пули вылетели, проблемы у вас.
Ответить с цитированием