Q&A

  • [질문] 포인터형 구조체를 매개변수로 사용하는 방법
dll prototype은 아래와 같습니다.
<!--CodeS-->
HRESULT WINAPI function(
  __in_opt  PTCHAR InitiatorInstance,
  __in_opt  ULONG InitiatorPortNumber,
  __in         PISCSI_TARGET_PORTAL Portal
);

typedef  struct _ISCSI_TARGET_PORTAL  {
                 TCHAR SymbolicName[MAX_ISCSI_PORTAL_NAME_LEN];
                 TCHAR Address[MAX_ISCSI_PORTAL_ADDRESS_LEN];
                 USHORT Socket;
              } ISCSI_TARGET_PORTAL,  *PISCSI_TARGET_PORTAL;
<!--CodeE-->

델파이 소스입니다.
<!--CodeS-->
procedure TFormMain.Button1Click(Sender: TObject);
const
  MAX_ISCSI_PORTAL_NAME_LEN  =  256;
  MAX_ISCSI_PORTAL_ADDRESS_LEN  =  256;
type
ISCSI_TARGET_PORTAL  =  packed  record
        SymbolicName  :  array[0..MAX_ISCSI_PORTAL_NAME_LEN]  of  CHAR;
        Address            :  array[0..MAX_ISCSI_PORTAL_ADDRESS_LEN  ]  of  CHAR;
        Socket              :  SHORT;
end;
PISCSI_TARGET_PORTAL  =  ^ISCSI_TARGET_PORTAL;

TdllFunction  =  function  (
                                           InitiatorInstance  :  PCHAR;
                                           InitiatorPortNumber  :  LongInt;
                                           Portal  :  PISCSI_TARGET_PORTAL
                                        )  :  HRESULT;  stdcall;
var
  H  :  THandle;
  dllFunction  :  TdllFunction;

  TARGET_PORTAL  :  PISCSI_TARGET_PORTAL;

  pSymbolic   :  PChar;
  pAddress  :  PChar;
  pSocketI  :  Integer;
  pSocketPI  :  PInteger;

  HR  :  HRESULT;
begin
  H  :=  LoadLibrary(  PChar( 'dll.dll' ) );
  @dllFunction  :=  GetProcAddress( H, PChar(  'function'  )  );
     ~
  pSymbolicName  :=  PChar( '' );
  CopyMemory( @TARGET_PORTAL.SymbolicName, pSymbolic, Length( pSymbolic  )  );
     ~
  pAddress  :=  PChar( 'int' );
  CopyMemory( @TARGET_PORTAL.Address, pAddress, Length( pAddress ) );
     ~
  pSocketI  :=  80;
  pSocketPI  :=  @pSocketI;
  TARGET_PORTAL.Socket  :=  pSocketPI^;
     ~
  HR  :=  dllFunction  (  '',  0,  @TARGET_PORTAL  );   <--- (1)
     ~
end;
<!--CodeE-->
위 소스에서 (1)번에 있는 dll 함수를 호출하는 부분에서 포인터로 매개변수를 제대로 넣은것인지 확인을 바랍니다.
실행을 하면 HR값에 "error code : 87, 매개변수가 틀립니다." 라고 오류 메시지가 나옵니다.
1  COMMENTS
  • Profile
    srookie 2008.11.08 01:56
    안녕하세요.
    ISCSI_TARGET_PORTAL의 Array의 개수가 위의 C Source의 Array 개수랑 틀린 것 같네요.
    0..256면 총 257 바이트가 되는 것이고, C에서는 256으로 선언되어 있거든요.
    그래서 매개변수의 값이 틀리다고 나오는 것이라고 예측이 되네요.

    즐코하세요.