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 로 바꾸어서 해보십시오~