일단 DLL은 C언어로 만들어져 있습니다.
그리고 제가 가지고 있는 것은 VB로 제작된 샘플입니다.
VB로 된 샘플을 델로 옮겨야 되는데.. 옮긴 후에 특정 함수에서 에러가 납니다.
s7_read_req 가 문제되는 함수이구요..
< vb 샘플 >
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)
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);
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;
다른 여러가지 함수를 호출할 때는 에러가 없고 이 함수 호출 시 에러가 납니다.
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 로 해야 한다는 내용도 있었습니다.
오늘 또 찾아보니.. 델에서도 String[n]으로 선언하면 크기를 정해줄수 있나보던데..
dll 함수 내용을 볼 수가 없으니까.. 비베 샘플을 보고 델로 바꿔야 하는데 너무
답답합니다 ㅜ.ㅠ 어떤 것이라도 좋으니.. 조언 좀 부탁드립니다.. (_ _);
|