掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
DLL内の関数を使用して機器を制御 (ID:48902)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
ある機器をそのメーカーが公開しているDLLを使用して制御する必要があります。 ただ、DLLがVC++で作成されており、ドキュメントもC++の内容で書かれています。 お恥ずかしながらC++の知識が全くなく手探り状態でDelphiで書いてみたのですが、構造体やポインタについての理解がうすいためうまく書けず、動作しません。 テストしているものはDLL内の関数(SetDate)を使用して機器の日付時刻を設定するというものです。 どうかご助言をいただけますようお願い致します。 //// 日付をセットする関数 C++//// long WINAPI SetDate(long abcKind, LPCSTR datetime, LPRESBASE outResp); //// outResp (関数を実行すると値がセットされる)//// typedef struct _REBASE { BYTE Status[3]; LANHEADER respHeader; } REBASE, *LPREBASE; //// LANHEADER構造体 ///// typedef struct _LANHEADER { BYTE Fix; BYTE MsgKind; BYTE MsgType; BYTE SerialNo[4]; BYTE Date[6]; BYTE MD; BYTE MachineID[5]; BYTE Status[2]; BYTE Reserv; ABCHEAD AbcHeader; } LANHEADER, *PTLANHEADER; //// ABCHEAD構造体 //// typedef struct{ BYTE AbcSN; BYTE AbcAPLID; }ABCHEAD; //// Delphiで手探りで書いてみたコード //// unit Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls; type ABCHEAD = record AbcSN: Byte; AbcAPLID: Byte; end; type LANHEADER = record Fix: Byte; MsKind: Byte; MsgType: Byte; SerialNo: array[0..3] of Byte; Date: array[0..5] of Byte; MD: Byte; MachineID: array[0..4] of Byte; Status: array[0..1] of Byte; Reserv: Byte; AbcHeader: ABCHEAD; end; type LPRESBASE = ^RESBASE; RESBASE = packed record Status: array[0..2] of Byte; respHeader: LANHEADER; end; var Form1: TForm1; function SetDate(abcKind: LongInt; datetime: LPCSTR; outResp: LPRESBASE): Integer; stdcall; external 'ABCIF.dll'; implementation procedure TForm1.Button1Click(Sender: TObject); var rslt,xabcKind: LongInt; pOutResp: LPRESBASE; xOutResp: RESBASE; xDateTime: String; pDatetime: PAnsiChar; xFix:Byte; begin xabcKind := 10; //関数のパラメータに使用 xDateTime := '201801011225'; //関数のパラメータに使用 GetMem(pDatetime, length(xDateTime) + 1); //pDatetimeのメモリを確保 StrPCopy(pDatetime, xDateTime); //pDatetimeに値をセット New(pOutResp); rslt := SetDate(xabcKind, pDatetime, pOutResp); //関数実行 showmessage(IntToStr(rslt)); //rslt=0で正常終了だが0以外が返る xFix := pOutResp^.respHeader.Fix; //respHeaderの中身を確認 FreeMem(pDatetime); Dispose(pOutResp); end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.