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를 만들어 가서 테스트를
해야 합니다. 어떤 것이라도 좋으니.. 조언 좀 부탁드립니다.. (_ _);