C를 전혀 모르니 연동이 정말 어렵네요!
도와주시면 감사하겠습니다.
아래 내용중
FS_GetSystemInformation(FS_SYSTEMINFORMATION *systeminformation)
만 실행하면 되는데 도저히 감이 안오네요!
레코드를 그냥 넘기면 되는건지 위의 별표는 뭔지 중요한거 같은데 ㅠㅜ
절망이 깊어가네요!
#ifndef __FIRMSYS_API_H__
#define __FIRMSYS_API_H__
#ifdef FIRMSYS_API_EXPORTS
#define FIRMSYS_API_API __declspec(dllexport)
#else
#define FIRMSYS_API_API __declspec(dllimport)
#endif
struct FS_UID
{
BYTE digit[8];
};
struct FS_SYSTEMINFORMATION
{
BYTE FG;
BYTE IF; // IF가 예약어인데 어쩌나요?
FS_UID uid;//
BYTE DSFID;
BYTE AFI;
BYTE BSN;
BYTE NBB;
BYTE IMC;
};
extern "C" FIRMSYS_API_API int WINAPI FS_GetSystemInformation(FS_SYSTEMINFORMATION *systeminformation);
뭐가 뭔지 모르지만 막무가내로 찾아보면서 아래처럼 시도는 해봤습니다.
type
FS_SYSTEMINFORMATION = record
FG: byte;
IF: byte; // IF --> 에러
uid: array[0..7] of byte;
DSFID: byte;
AFI: byte;
BSN: byte;
NBB: byte;
IMC: byte;
end;
//type
//PFS_SYSTEMINFORMATION = ^FS_SYSTEMINFORMATION; //????????
function FS_Inventory(var FS_SYSTEMINFORMATION: FS_SYSTEMINFORMATION): integer; stdcall; external 'FirmSYS.dll';
답변 정말 감사드립니다. 말씀해주시니 그래도 희망이 보이는듯 싶어~ 밤샜는데 아직도 안되네요!
그런데 질문이 약간 틀려서 다시 여기에 씁니다.
-------------------------------
FS_Inventory(FS_SYSTEMINFORMATION *systeminformation)
만 실행하면 되는데 도저히 감이 안오네요!
레코드를 그냥 넘기면 되는건지 위의 별표는 뭔지 중요한거 같은데 ㅠㅜ
절망이 깊어가네요!
#ifndef __FIRMSYS_API_H__
#define __FIRMSYS_API_H__
#ifdef FIRMSYS_API_EXPORTS
#define FIRMSYS_API_API __declspec(dllexport)
#else
#define FIRMSYS_API_API __declspec(dllimport)
#endif
#define RESPONSE 0 // Response
#define ERROR_RESPONSE 1 // Error Code Response
#define START_RESPONSE 2 // Start Code Response
#define NOT_RESPONSE 3 // Not Response
struct FS_UID
{
BYTE digit[8];
};
struct FS_SYSTEMINFORMATION
{
BYTE FG;
BYTE IF; // IF가 예약어인데 어쩌나요?
FS_UID uid;//
BYTE DSFID;
BYTE AFI;
BYTE BSN;
BYTE NBB;
BYTE IMC;
};
extern "C" FIRMSYS_API_API int WINAPI FS_Inventory(FS_SYSTEMINFORMATION *systeminformation);
뭐가 뭔지 모르지만 막무가내로 찾아보면서 아래처럼 시도는 해봤습니다.
type
FS_SYSTEMINFORMATION = record
FG: byte;
IIF: byte; //
uid: array[0..7] of byte;
DSFID: byte;
AFI: byte;
BSN: byte;
NBB: byte;
IMC: byte;
end;
function FS_Inventory(var systeminformation: FS_SYSTEMINFORMATION): integer; stdcall; external 'FirmSYS.dll';
제대로 된 건가요???
procedure TForm1.Button2Click(Sender: TObject);
var tagid: FS_SYSTEMINFORMATION;
i: Integer;
s: string;
begin
FillChar(tagid.uid, SizeOf(tagid.uid), 0);
i:= FS_Inventory(tagid);
ShowMessage(IntToStr(i));
end;
실행은 되는데 1 // Error Code Response 만 리턴됩니다
여기서 어떻게 할 엄두가 나질 않네요 헉~
통신 포트를 닫고 실행하면 3 // Not Response 이 리턴 되네요!
------------------
..
function FS_Inventory(var systeminformation: FS_SYSTEMINFORMATION): integer;cdecl; external 'FirmSYS.dll';
로 해보세요~
답변 정말 감사합니다.
이정욱님이 쓰신 철저공략 델파이7 아직도 잘 보고 있습니다.
아직도 절반도 못봤지만^^
포인터로 넘기기도 하고 별짓 다했는데 허무하게도 장비 자체 에러였습니다.
아뭏든 C땜에 헤매는 델피언들에게 조금이나마 도움될까 싶어 해결된 소스 올립니다.
관심주셔서 감사합니다.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
{type
FS_UID = record
digit: array[0..7] of byte;
end;}
type
//PFS_SYSTEMINFORMATION = ^FS_SYSTEMINFORMATION;
FS_SYSTEMINFORMATION = record //packed
FG: byte;
IIF: byte;
uid: array[0..7] of byte;//uid: FS_UID;
DSFID: byte;
AFI: byte;
BSN: byte;
NBB: byte;
IMC: byte;
end;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
{
//C
extern "C" FIRMSYS_API_API int WINAPI FS_Inventory(FS_SYSTEMINFORMATION *systeminformation);
//VB
Public Declare Function FS_Open Lib "FirmSYS.dll" (ByVal portNum As Integer, ByVal baudRate As Long) As Boolean
Public Declare Function FS_Inventory Lib "FirmSYS.dll" (ByRef systeminformation As FS_SYSTEMINFORMATION) As Long
}
function FS_Open(portNum: SmallInt; baudRate: longInt): Boolean; stdcall; external 'FirmSYS.dll';
procedure FS_Close(); stdcall; external 'FirmSYS.dll';
//function FS_Inventory(var systeminformation: PFS_SYSTEMINFORMATION): longInt; stdcall; external 'FirmSYS.dll';
function FS_Inventory(var systeminformation: FS_SYSTEMINFORMATION): longInt; stdcall; external 'FirmSYS.dll';//cdecl
function FS_RFPowerOn(): integer; stdcall; external 'FirmSYS.dll';
function FS_RFPowerOff(): integer; stdcall; external 'FirmSYS.dll';
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if FS_Open(0, 38400) then
ShowMessage('Open')
else
Showmessage('NoOpen');
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
ShowMessage(IntToStr(FS_RFPowerOn));
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
ShowMessage(IntToStr(FS_RFPowerOff));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FS_Close;
end;
procedure TForm1.Button3Click(Sender: TObject);
var tagid: FS_SYSTEMINFORMATION;
i: Integer;
s, str: string;
begin
str := '';
FillChar(tagid.uid, SizeOf(tagid.uid), 0);
i:= FS_Inventory(tagid);//FS_GetSystemInformation
ShowMessage(IntToStr(i));//0이면 성공
for i:= 7 downto 0 do
begin
s := IntToHex(tagid.uid[i], 0);
if length(s) = 1 Then
str := str + '0' + s
else
str := str + s;
end;
Edit1.Text := str; // E00401005433B44D 형식으로 리턴됨
end;
end.
IF 라는 변수명은 중요하지 않습니다. 중요한것은 데이타 타잎 입니다.
데이타 타잎만 맞으면 저 레코드의 크기가 FS_SYSTEMINFORMATION 와 맞기 때문에 그대로 들어옵니다.
그냥 IF 를 IFF 로 바꿔서 해도 된다는 뜻입니다 ^^
그리고 위에서 사용하시는 것처럼 하면 되실 것 같네요.
혹시 안되시면 stdcall 을 cdecl 로 바꾸어서 해보십시오~