2010-10-01 3 views
1

У меня проблемы с отправкой с использованием процедуры Dll с параметрами, им не разрешено добавлять параметры в вызов метода dll в моем тестовом проекте.Как вызвать процедуру DLL с параметрами?

Im пытается вызвать этот метод Dll:

procedure Transfer(sMessage: PChar); stdcall; 
begin 
    MainForm.ShowThis(sMessage); 
end; 

exports 
Transfer; 

TestProj с помощью этого:

procedure TForm1.Button1Click(Sender: TObject); 
var 
DLLHandle : THandle; 
begin 
    DLLHandle := LoadLibrary ('C:\Program Files\Borland\Delphi5\Projects\Dll\MyLink.dll'); 
    if DLLHandle >= 32 then 
     try 
       @Trans := GetProcAddress (DLLHandle, 'Transfer'); 
       if @Trans <> nil then 
        Trans //Would like to say something like: Trans('Hello') 
       else 
       Showmessage('Could not load method address'); 

     finally 
      FreeLibrary(DLLHandle); 
    end 
    else 
     Showmessage('Could not load the dll'); 
end; 

Ошибка компиляции я получу, если я использую "Trans ('Hello')" является: [Error] Unit1.pas (51): Слишком много фактических параметров.

Мне разрешено запускать его без параметров, но затем я получаю только джибера в своем окне showmessage и после сбоя, так как я не отправляю никаких сообщений.

Итак, вопрос в том, как я могу отправить строку в качестве параметра в dll? Что я делаю не так ?

ответ

1

Вы не должны использовать знак указателя (@) в левой части присваивания, переменная Trans должна выглядеть следующим образом:

type 
    TTransferPtr = procedure (sMessage: PChar); stdcall; 

var 
    Trans: TTransferPtr; 

// Then use it like this: 
Trans := TTransferPtr(GetProcAddress (DLLHandle, 'Transfer')); 
if @Trans <> nil then 
    Trans(PChar('Hello')); 
+0

Благодаря его Allmost работал так, как вы Сайд. First of Transfer - это процедура, поэтому она не должна возвращать строку так: TTransferPtr = procedure (sMessage: PChar); STDCALL. И если Trans <> nil для работы, он должен быть адресом указателя: if @Trans <> nil. Но другое тогда, что это право. Еще раз спасибо – Roise

+0

Ах, извините за ошибки, я должен был сначала протестировать его перед публикацией. –

+0

Если DLL написана в пред-D2009, приложение должно использовать 'PAnsiChar' вместо' PChar' для обеспечения совместимости, если приложение написано/обновлено до D2009 +. –

Смежные вопросы