ISCSI_LOGIN_OPTIONS 와 ISCSI_TARGET_INFO_EX 의 레코드 두개를 선언하였습니다.
ISCSI_TARGET_INFO_EX 레코드에는 ISCSI_LOGIN_OPTIONS 레코드가 포함됩니다.
질문사항
(1) ISCSI_TARGET_INFO_EX 레코드의 초기화는 어떻게 해야 할까요?
저는 이렇게 했습니다.
var
Login_Options : ISCSI_LOGIN_OPTIONS;
Portal_Info : ISCSI_TARGET_PORTAL_INFO_EX;
begin
ZeroMemory( @Portal_Info, Sizeof( ISCSI_TARGET_INFO_EX ) );
이렇게 하면
ISCSI_TARGET_INFO_EX 에 포함된
ISCSI_LOGIN_OPTIONS 도 같이 초기화가 될까요?
(2) ISCSI_TARGET_INFO_EX 레코드를 dll 에서 파라메터로 in out을 어떻게 해야 할까요?
HR := dllFunction ( Portal_Count, SizeNeeded, PortalInfoArray );
이렇게 dll 을 호출할 때
"Types of actual and formal var parameters must be identical"
메시지가 발생합니다.
<!--CodeS-->
type
ISCSI_LOGIN_OPTIONS = packed record
Version : CARDINAL;
InformationSpecified : ISCSI_LOGIN_OPTIONS_INFO_SPECIFIED;
LoginFlags : ISCSI_LOGIN_FLAGS
end;
PISCSI_PISCSI_LOGIN_OPTIONS = ^ISCSI_LOGIN_OPTIONS;
ISCSI_TARGET_INFO_EX = packed record
InitiatorName : array[0..MAX_ISCSI_HBANAME_LEN] of CHAR;
InitiatorPortNumber : LongInt;
SymbolicName : array[0..MAX_ISCSI_PORTAL_NAME_LEN] of CHAR;
Address : array[0..MAX_ISCSI_PORTAL_ADDRESS_LEN] of CHAR;
Socket : SmallInt;
SecurityFlags : Int64;
LoginOptions : ISCSI_LOGIN_OPTIONS;
end;
PISCSI_TARGET_PORTAL_INFO_EX = ^ISCSI_TARGET_PORTAL_INFO_EX;
TdllFunction = function ( PortalCount : CARDINAL;
var PortalInfoSize : CARDINAL;
var PortalInfo : PISCSI_TARGET_PORTAL_INFO_EX
) : HRESULT; stdcall;
<!--CodeE-->
@ 구조체 초기화
ZeroMemory 로 ISCSI_TARGET_PORTAL_INFO_EX 구조체를 초기화 할때
Sizeof( ISCSI_TARGET_INFO_EX ) 값이 ISCSI_LOGIN_OPTIONS를 포함한 구조체 크기가 되면 되겠죠
c , c++에서 하듯이 당연히 됩니다.
@ 구조체를 dll의 파라메터로 넘겨야 한다구요?
어떤 타입도 Pointer 로 넘기면 dll 개발언어가 delphi가 아니라도 전혀 문제가 될것 없습니다.
함수선언에서 타입만 맞춰주며 컴파일에러는 나지 않을것입니다.
dllFunction 함수가 어떻게 선언되어잇냐에 따라.... 다르겠죠