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, 매개변수가 틀립니다." 라고 오류 메시지가 나옵니다.
ISCSI_TARGET_PORTAL의 Array의 개수가 위의 C Source의 Array 개수랑 틀린 것 같네요.
0..256면 총 257 바이트가 되는 것이고, C에서는 256으로 선언되어 있거든요.
그래서 매개변수의 값이 틀리다고 나오는 것이라고 예측이 되네요.
즐코하세요.