はじめて投稿します。
333と申します。よろしくお願いいたします。
環境-------------
OS Win2000 SP4
DELPHI Ver5.0
VB 6.0
(ただし現在テスト環境なのでACCESS2000にて検証)
状況-------------
現在稼動中のBPLファイルがあり、
そのBPL内の関数をVBから実行させるためにDLLを作成しました。
引数の数が多いため、VBからDLLへは構造体を使用して引数を渡そうと考えました。
(String型に関連して、構造体で渡すとDELPHI←→VBのやり取りがうまくいくという
記述を見たのも理由の一つになります)
コーディングをはじめ、テストをしたのですが構造体の内容を表示させると
何も入っていないようなのです。
仮に、String型の引数をもうひとつ追加してみたのですが、
これは正常に渡っています。
こちらのほかの投稿で、INTEGER型の要素が奇数だとおかしくなるというのも読んだので
ダミーの要素を追加してみましたが、現状は変わりませんでした。
記述の一部を載せますので、おわかりの方教えていただけないでしょうか。
よろしくお願いします。
上記投稿のソースです。
よろしくお願いします。
// DLLソース---------------------------------------------------------
library TESTDLL;
uses
TESTu in 'TESTu.pas';
exports
CallTESTDLL;
{$R *.RES}
begin
end.
// TESTu.pas(抜粋)------------------------------------------------
// パラメータ情報レコード
pParamType = ^TParamRec;
TParamRec = Packed Record
iCodeA : Integer;
iCodeB : Integer;
iCodeC : Integer;
iCodeD : Integer;
iCodeE : Integer;
iDummy : Integer;
sNameA : PChar;
sNameB : PChar;
sNameC : PChar;
sNameD : PChar;
end;
function CallTESTDLL(pPar:Pointer; aa:PChar ):Integer; stdcall;
implementation
function CallTESTDLL(pPar:Pointer; aa:PChar):Integer;
begin
↓(テスト結果)このメッセージは正常に表示されます
showmessage(aa);
GetParam(pParamType(pPar));
↓(テスト結果)この戻り値も返っています
result := 999;
end;
procedure GetParam(pPar:pParamType);
var
lstParam : TStringLIst;
wk : String;
begin
lstParam := TStringLIst.Create;
try
with pPar^ do
begin
lstParam.Add('iCodeA=' + IntToStr(iCodeA));
wk := sNameA;
lstParam.Add('sNameA=' + wk);
lstParam.Add('iCodeB=' + IntToStr(iCodeB));
lstParam.Add('iCodeC=' + IntToStr(iCodeC));
lstParam.Add('iCodeD=' + IntToStr(iCodeD));
lstParam.Add('iCodeE=' + IntToStr(iCodeE));
lstParam.Add('sNameB=' + sNameB);
lstParam.Add('sNameC=' + sNameC);
lstParam.Add('sNameD=' + sNameD);
end;
↓(テスト結果)この表示では、数値部分は0、文字列部分は空白''です
Showmessage('DLL Get Params' + #13#10 + lstParam.CommaText);
finally
lstParam.Free;
end;
end;
// VB(A)ソース--------------------------------------------------------
// モジュール
Type TParamRec
iCodeA As Long
iCodeB As Long
iCodeC As Long
iCodeD As Long
iCodeE As Long
iDummy As Long
sNameA As String
sNameB As String
sNameC As String
sNameD As String
End Type
Public Declare Function CallTESTDLL Lib "TESTDLL.dll" (ByRef sParam As TParamRec, ByVal ss As String) As Long
Public Param As TParamRec
// フォーム
Private Sub コマンド0_Click()
Dim lngRet As Long
With Param
iCodeA = 100
sNameA = "100A"
sNameC = "C:\TEST\AA.TXT C:\BB.CSV"
End With
lngRet = CallTESTDLL(Param, "TEST!")
MsgBox ("戻り値:" & lngRet)
End Sub
> With Param
> iCodeA = 100
> sNameA = "100A"
> sNameC = "C:\TEST\AA.TXT C:\BB.CSV"
> End With
iCodeA, sNameA, sNameCの変数が定義されておらず、DLLにも渡していません。
ピリオドを忘れていませんか?
Option Explicitを指定することをお薦めします。
にしのさん、ありがとうございました。
初歩的なミスで恥ずかしいです。
これに半日あまり費やしていたので・・・
>Option?Explicitを指定することをお薦めします。
これからは気をつけるようにします。
ツイート | ![]() |