C++用のDLLをDelphiから利用する方法


Yama  2006-07-15 17:14:21  No: 22517

お世話になります。
C++用に作成されたDLLをDelphiから利用する必要に迫られました。出来るだけ具体的な方法、サンプルなどの情報(本)がありましたら、ぜひ、紹介してください。  すでに、過去の掲示板にあるかと検索してみましたが、検索が下手なのか見つかりませんでした。  
よろしくお願いします。


Syake  2006-07-15 18:16:40  No: 22518

C++用に作成された・・・は如何様なものなのかはわかりませんが
一般的なら
Tips:
http://hp.vector.co.jp/authors/VA015730/delphi/TipsTips.html#DLLの使い方
http://hata.cc/docs/DLL/contents.html

書籍:
「Delphi6プログラミングバイブル」など

は、如何でしょうか・・・


Yama  2006-07-18 12:21:14  No: 22519

情報ありがとうございます。
調べて何とかいけそうな気配です。
もし、不明な点がでましたら、今度は具体的な例でお聞きしますので、
その際は、また、よろしくお願いします。


Yama  2006-07-22 16:14:44  No: 22520

Cを知らないので苦労しています。
例えば、Cのヘッダーファイルと関数が下記のように定義されている場合、

/* アカウント情報 */
typedef struct _MemberInfo
{
        char id[32];
        char pass[32];
} MemberInfo;
      
long  Authentication(MemberInfo *Info,long InMethod,long *OutStatus)
引数:
 Info   : MemberInfo型へのポインタを渡します。
 Method : ログイン時:   0
          ログアウト時: 1
 OutStatus : ステータス情報へのポインタを渡します。

上記のCで作られたDLLをDelphiから呼ぶルーチンですが、
どうもうまくいきません。  どこがおかしいのでしょうか。

{アカウント情報}
type _MemberInfo = record
       id:         Array[0..32-1] of Char;
       pass:       Array[0..32-1] of Char;
     end {_MemberInfo};
     MemberInfo = _MemberInfo;

//Delphiの定義
function Authentication(PMemver:Pointer; InMethod:longint; PStatus:pointer): longint;
           stdcall; external 'GETDATA.DLL' name 'Authentication';

//テスト
function checkAuthenication;
var DLLHandle: THandle;
    i:         integer;
    aMember:   Memberinfo;
    Status:    longint;
begin
  DLLHandle := LoadLibrary('GETDATA.DLL'); 
  if DLLHandle > 32 then begin
    with aMember do begin
      id    :='0000';
      pass  :='1111';
    end;
    i := Authentication(@aMember,0,@Status);
    if i=0 then 
      showMessage('認証成功');
    else 
      showMessage('認証失敗 ErrorCode='+tostr(Status));
  end;
end;


igy  2006-07-23 06:51:45  No: 22521

>function Authentication(PMemver:Pointer; InMethod:longint; PStatus:pointer): longint;

function Authentication(var PMemver: MemberInfo; InMethod: longint; var PStatus: longInt): longint;
にして、

>    i := Authentication(@aMember,0,@Status);

    i := Authentication(aMember, 0, Status);

にしたら、どうなりますか?


Yama  2006-07-23 07:33:04  No: 22522

ありがとうございます。

実行してみましたが、同じエラー(Status)で帰ってきます。
このエラーを示すStatusのコードがリストにないので、Statusの渡し方も違っているのかと思っています。

varを付けると参照渡しでポインター渡しですか。
ID,PASSの渡し方が違うのかとか悩んでいます。


igy  2006-07-23 08:51:02  No: 22523

>      id    :='0000';
>      pass  :='1111';

       StrPCopy(id, '0000');
      StrPCopy(pass, '1111');
にしたら、どうなりますか?


Yama  2006-07-23 09:21:48  No: 22524

同じでした。

このDLLは、WinInet.DLL使っているようなのですが、別のソフトでWinInetを直接使った認証はうまくいっていますので、Wininet.dllは問題ないようです。


igy  2006-07-23 18:27:23  No: 22525

>同じエラー(Status)で帰ってきます。

具体的には、Statusは、何が格納されていますか?

>このエラーを示すStatusのコードがリストにない

具体的には、リストは、何が挙げられていますか?

>      showMessage('認証失敗 ErrorCode='+tostr(Status));

tostr は IntToStr とは違うのですか?


Yama  2006-07-23 22:20:37  No: 22526

Statusのエラーは87で戻ってきます。
仕様上は下記の、1200以降のHTTPのエラーメッセージがそのまま戻るようになっています。

http://msdn.microsoft.com/library/en-us/wininet/wininet/wininet_errors.asp?FRAME=true#ERROR_NO_MORE_FILES

提供されているC++用のDLLについても、もういちど調べてみます。


ふむ  2006-07-24 00:34:16  No: 22527

エラーとは直接関係ないですが、誰も指摘されないようなので・・・
上の方で提示されているソースで
function Authentication(PMemver:Pointer; InMethod:longint; PStatus:pointer): longint;
         stdcall; external 'GETDATA.DLL' name 'Authentication';
と静的リンクで定義しているのに対して
function checkAuthenication;
ではLoadLibrary('GETDATA.DLL');  (動的リンク)の記述があります。
(それにGetProcAddressでアドレスの取得もしていません)
簡単にテストするにはまず静的リンクでチェックすればよろしいかと。
(LoadLibrary・・・は必要ないです)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加