Q&A

  • C로 개발된 dll 질문입니다

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';

 

 

 

4  COMMENTS
  • Profile
    이정욱 2011.11.03 07:27

    IF 라는 변수명은 중요하지 않습니다. 중요한것은 데이타 타잎 입니다.

    데이타 타잎만 맞으면 저 레코드의 크기가 FS_SYSTEMINFORMATION 와 맞기 때문에 그대로 들어옵니다.

    그냥 IF 를 IFF 로 바꿔서 해도 된다는 뜻입니다 ^^

    그리고 위에서 사용하시는 것처럼 하면 되실 것 같네요. 

    혹시 안되시면 stdcall 을 cdecl 로 바꾸어서 해보십시오~

  • Profile
    허쩝 2011.11.03 17:02

    답변 정말 감사드립니다. 말씀해주시니 그래도 희망이 보이는듯 싶어~ 밤샜는데 아직도 안되네요!

    그런데 질문이 약간 틀려서 다시 여기에 씁니다.

     

    ------------------------------- 

    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 이 리턴 되네요!
    ------------------

    ..

  • Profile
    이정욱 2011.11.03 17:10

    function  FS_Inventory(var systeminformation: FS_SYSTEMINFORMATION): integer;cdecl; external 'FirmSYS.dll'; 


    로 해보세요~

  • Profile
    허쩝 2011.11.03 20:18

    답변 정말 감사합니다.

    이정욱님이 쓰신 철저공략 델파이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.