2011-07-07 15 views
-4

私はdelphiのnoobですので、これで私を助けてください。私は、次のコードでDLLを作成しました:デルファイ7でDllを呼び出してパラメータを渡す方法

library PRdll; 
    uses 
ExceptionLog, SysUtils,Classes,Dialogs; 

{$R *.res} 

    function DllMessage(var a:integer):Integer;stdcall;export; 
    begin 
     Showmessage('GHelloa');//this is displayed 
     ShowMessage(IntToStr(a));//I get the error at this point 
     Result:=5; 
    end; 

    exports DllMessage; 
    begin 
    end. 

DLLに対応するコールは、このコードによって与えられる:私はアクセスエラーが発生します

var 
     FDll: TFDll; 
     function DllMessage(var a:integer):integer;stdcall;external 'PRDll.dll'; 
    implementation 

    {$R *.dfm} 

     procedure TFDll.btnCallDllClick(Sender: TObject); 
     var 
     i:integer; 
     s1:string; 
     begin 
      i:=5; 
      s1:=IntToStr(DllMessage(i)); 
     //ShowMessage(s1); 
     end; 

。なぜこれが起こるのですか?誰か?助けて!!! ありがとうございます

+0

本当のコードは、私がそれを投稿しなかった理由が大きいです。とにかく私は今投稿しています – CyprUS

+1

私は誤解して申し訳ありません。このエラーの理由は何もわかりません。 –

+0

DLLとEXEの両方でDllMessageの宣言を再確認できますか?あなたはここにそれがあると確信していますか?私はあなたが '輸出'が必要だとは思っていませんが、それは良性だと私は信じています。 –

答えて

0

正しいコードは以下の通りです。私は誰も私にこの簡単なことを教えることができない理由に驚いています

//Dll 
library ProDll; 

uses 
    ExceptionLog, 
    SysUtils, 
    Classes,Dialogs; 

    function showSqRoot(var a:Double):Double; stdcall; export; 
    begin 

    Result:=sqrt(a); 
    end; 

    exports showSqRoot; 
    {$R *.res} 

    begin 
    end. 


//The program 
    function showSqRoot(var a:Double):Double;stdcall external 'ProDll.dll'//Notice 'stdcall external' here 

procedure TFcallDLL.btnCallDLLClick(Sender: TObject); 
    var 
     numInput,numRes:Double; {Input and Result} 
    begin 
     numInput:=StrToFloat(edtInput.Text); 
     numRes:=showSqRoot(numInput); {call the function in DLL with the Parameter} 
     edtResult.Text:=FloatToStr(numRes); {Display the Result} 
    end; 

このコードはうまくいきました。

2

sharememユニットを追加しましたか?
ヘルプを参照してください。

第2のオプション:ExceptionLog行をコメントしてもう一度やり直してください。
正常に動作します。

よろしくお願いいたします。

+1

答えはありません。 DLL関数は、exeが解放する必要があるメモリを割り当てません。 Sharememは何の違いもありません。 –

+1

ExceptionLogの使用方法についてコメントして、もう一度お試しください。 –

+0

@Cosmin Prund;さて、この特定のケースでは、それは必要ではありません。 DLL上にコードがなくなる(これはサンプルではありません)必要はありません。 2番目の+1は –

関連する問題