Q&A

  • [질문] 레코드 타입의 초기화
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-->
1  COMMENTS
  • Profile
    장성호 2008.11.15 02:19


    @ 구조체 초기화

    ZeroMemory 로 ISCSI_TARGET_PORTAL_INFO_EX 구조체를 초기화 할때
    Sizeof( ISCSI_TARGET_INFO_EX ) 값이 ISCSI_LOGIN_OPTIONS를 포함한 구조체 크기가 되면 되겠죠

    c , c++에서 하듯이 당연히 됩니다.


    @ 구조체를 dll의 파라메터로 넘겨야 한다구요?

    어떤 타입도 Pointer 로 넘기면 dll 개발언어가 delphi가 아니라도 전혀 문제가 될것 없습니다.

    함수선언에서 타입만 맞춰주며 컴파일에러는 나지 않을것입니다.

    dllFunction 함수가 어떻게 선언되어잇냐에 따라.... 다르겠죠