Q&A

  • DLL안에 있는 함수를 호출하는데 에러가 발생합니다. ㅠ.ㅜ
DLL 파일이 하나 있고, VB로 된 샘플 코드가 하나 있습니다.

이것을 그대로 똑같이 동작하도록 델파이로 옮겨야 합니다.

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

비베 샘플 : s7_read_req 가 문제되는 함수

Private Sub mnuR_MB0_3_Click()

  Dim bArray(0 To S7_MAX_VALUES - 1) As Byte
  Dim value_array as Variant

  read_para.var_name = "MBYTE0," + str$(S7_MAX_VALUES)
  value_array = bArray
  retval = s7_read_req(cp_descr, c_ref, orderid, read_para)
  Puts (GetS7Str("s7_read_req -> " + Trim(read_para.var_name), retval))
End Sub

함수 원형

Declare Function s7_read_req Lib "s732std.dll" (ByVal cp_descr As Long, ByVal cref As Integer, ByVal orderid As Integer, read_para_ptr As S7_READ_PARA) As Long

read_para의 구조체

Type S7_READ_PARA
   Access                           As Integer
   var_name                         As String * S7_MAX_NAM_STRINGLEN
   index                            As Integer
   subindex                         As Integer
   address_len                      As Integer
   address(0 To S7_MAX_ADDRESSLEN - 1) As Byte
End Type

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


델로 바꾼 코드


procedure TCraneOnline.ReadMByte_0_3;
var
FunctionName : String;
bArray : array of Byte;
value_array : Variant;
begin
  SetLength(bArray, S7_MAX_VALUES);
  FArrayFlag := True;
  read_para.var_name := PChar('MBYTE0, ' + inttostr(S7_MAX_VALUES));
  FValue_array := VarArrayCreate([0,S7_MAX_VALUES - 1], varByte);

  Fvalue_array := bArray;
  Fretval := s7_read_req(cp_descr, c_ref, orderid, read_para);
  FunctionName := 's7_read_req -> '  + Trim(read_para.var_name);
  Puts(GetS7Str(FunctionName, FRetVal), Form1.Label1);
end;

함수 선언

Function s7_read_req( cp_descr : Longint;  cref : SmallInt;  orderid : SmallInt; var read_para_ptr : S7_READ_PARA) : Longint; stdcall;

구현부

Function s7_read_req; external 's732std.dll' name 's7_read_req'

read_para의 구조체

  S7_READ_PARA = record
     Access                           : SmallInt;
     //var_name                         : String * S7_MAX_NAM_STRINGLEN
     var_name                         : PChar;
     index                            : SmallInt;
     subindex                         : SmallInt;
     address_len                      : SmallInt;
     address                          : array[0..31] of Byte;
  end;


먼저 질문 올렸을 때, String을 PChar로 하라고 하셔서.. 일단 오류 없이 실행이되고

다른 여러가지 함수를 호출할 때는 에러가 없고 이 함수 호출 시 에러가 납니다.

value_array라는 놈이 Variant 인데 Byte 배열을 대입하는데..

델로 저렇게 바꾸는게 맞는지... 저 부분이 조금 의심되고.. 구조체 안의 var_name의

형태도.. PChar로 놓는게 맞는지. 확신이 가질 않습니다..

비베의 var_name을 보면 String * n 의 형태로 되어 있는데.. 찾아보니 크기를 고정

시키는 형태고 인터넷에서 어떤 문서에서 보니 저것을 array[0..n-1] of char 로

변경을 해야 한다는 말(고정길이이므로)도 있고, 또 어떤 글은 비베에서는 Unicode로

String을 처리하기 때문에, array[0..n-1] of widechar 로 해야 한다는 내용도 있었습니다.

dll 함수 내용을 볼 수가 없으니까.. 비베 샘플을 보고 델로 바꿔야 하는데 너무

답답합니다 ㅜ.ㅠ 이 프로그램이 PLC로부터 신호를 받아서 처리하는 프로그램이라

제가 여기서 바로 테스트를 해 볼수가 없어서 최대한 많은 Case를 만들어 가서 테스트를

해야 합니다. 어떤 것이라도 좋으니.. 조언 좀 부탁드립니다.. (_ _);
0  COMMENTS