お世話になります。
C++用に作成されたDLLをDelphiから利用する必要に迫られました。出来るだけ具体的な方法、サンプルなどの情報(本)がありましたら、ぜひ、紹介してください。 すでに、過去の掲示板にあるかと検索してみましたが、検索が下手なのか見つかりませんでした。
よろしくお願いします。
C++用に作成された・・・は如何様なものなのかはわかりませんが
一般的なら
Tips:
http://hp.vector.co.jp/authors/VA015730/delphi/TipsTips.html#DLLの使い方
http://hata.cc/docs/DLL/contents.html
書籍:
「Delphi6プログラミングバイブル」など
は、如何でしょうか・・・
情報ありがとうございます。
調べて何とかいけそうな気配です。
もし、不明な点がでましたら、今度は具体的な例でお聞きしますので、
その際は、また、よろしくお願いします。
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;
>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);
にしたら、どうなりますか?
ありがとうございます。
実行してみましたが、同じエラー(Status)で帰ってきます。
このエラーを示すStatusのコードがリストにないので、Statusの渡し方も違っているのかと思っています。
varを付けると参照渡しでポインター渡しですか。
ID,PASSの渡し方が違うのかとか悩んでいます。
> id :='0000';
> pass :='1111';
を
StrPCopy(id, '0000');
StrPCopy(pass, '1111');
にしたら、どうなりますか?
同じでした。
このDLLは、WinInet.DLL使っているようなのですが、別のソフトでWinInetを直接使った認証はうまくいっていますので、Wininet.dllは問題ないようです。
>同じエラー(Status)で帰ってきます。
具体的には、Statusは、何が格納されていますか?
>このエラーを示すStatusのコードがリストにない
具体的には、リストは、何が挙げられていますか?
> showMessage('認証失敗 ErrorCode='+tostr(Status));
tostr は IntToStr とは違うのですか?
Statusのエラーは87で戻ってきます。
仕様上は下記の、1200以降のHTTPのエラーメッセージがそのまま戻るようになっています。
提供されているC++用のDLLについても、もういちど調べてみます。
エラーとは直接関係ないですが、誰も指摘されないようなので・・・
上の方で提示されているソースで
function Authentication(PMemver:Pointer; InMethod:longint; PStatus:pointer): longint;
stdcall; external 'GETDATA.DLL' name 'Authentication';
と静的リンクで定義しているのに対して
function checkAuthenication;
ではLoadLibrary('GETDATA.DLL'); (動的リンク)の記述があります。
(それにGetProcAddressでアドレスの取得もしていません)
簡単にテストするにはまず静的リンクでチェックすればよろしいかと。
(LoadLibrary・・・は必要ないです)
ツイート | ![]() |