DELPHIで作成したDLLをACCESSから呼び出すと構造体の引数の値が取れない

解決


333  2005-10-07 19:17:11  No: 17946

はじめて投稿します。
333と申します。よろしくお願いいたします。

環境-------------
OS  Win2000 SP4
DELPHI Ver5.0
VB  6.0  
  (ただし現在テスト環境なのでACCESS2000にて検証)

状況-------------
現在稼動中のBPLファイルがあり、
そのBPL内の関数をVBから実行させるためにDLLを作成しました。
引数の数が多いため、VBからDLLへは構造体を使用して引数を渡そうと考えました。
(String型に関連して、構造体で渡すとDELPHI←→VBのやり取りがうまくいくという
記述を見たのも理由の一つになります)

コーディングをはじめ、テストをしたのですが構造体の内容を表示させると
何も入っていないようなのです。
仮に、String型の引数をもうひとつ追加してみたのですが、
これは正常に渡っています。

こちらのほかの投稿で、INTEGER型の要素が奇数だとおかしくなるというのも読んだので
ダミーの要素を追加してみましたが、現状は変わりませんでした。

記述の一部を載せますので、おわかりの方教えていただけないでしょうか。
よろしくお願いします。


333  2005-10-07 19:18:21  No: 17947

上記投稿のソースです。
よろしくお願いします。
// 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


にしの  2005-10-07 23:43:03  No: 17948

>    With Param
>        iCodeA = 100
>        sNameA = "100A"
>        sNameC = "C:\TEST\AA.TXT C:\BB.CSV"
>    End With

iCodeA, sNameA, sNameCの変数が定義されておらず、DLLにも渡していません。
ピリオドを忘れていませんか?

Option Explicitを指定することをお薦めします。


333  2005-10-08 00:35:19  No: 17949

にしのさん、ありがとうございました。

初歩的なミスで恥ずかしいです。
これに半日あまり費やしていたので・・・

>Option?Explicitを指定することをお薦めします。
これからは気をつけるようにします。


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

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






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