Q&A

  • [질문] dll 타입 변경
[ 질문 1 ]
C로 작성된 dll 구조는 아래와 같습니다.
이 dll 형식으로  델파이에서 호출 하려고 합니다.
델파이 형식으로 변환을 부탁드립니다.

<!--CodeS-->
HRESULT WINAPI AddIScsiSendTargetPortal(
  __in_opt  PTCHAR InitiatorName,
  __in_opt  ULONG InitiatorPortNumber,
  __in_opt  PISCI_LOGIN_OPTIONS LoginOptions,
  __in_opt  ISCSI_SECURITY_FLAGS SecurityFlags,
  __out      ISCSI_OUTPUT OUTPUT,
                  PISCSI_TARGET_PORTAL Portal
);
<!--CodeE-->
[ 질문 2 ]
PISCSI_TARGET_PORTAL Portal은 무슨 의미일까요? (in도 out도 아닌 그냥 빈칸으로 되어있습니다.)
또 어떻게 사용해야 하는가요?

[ 질문 3 ]
opt는 선택적인 파라메터 값으로 아는데,
function에서 호출할때 opt 파라메터가 해당사항이 없다면 빼고 해도 되는지,
아니면 널값으로 파라메터 갯수를 맞추어야 하는지요..

참고로 아래는 위의 AddIScsiSendTargetPortal에서 사용되는 변수선언입니다.

<!--CodeS-->
typedef structtypedef struct _ISCSI_LOGIN_OPTIONS {
  ULONG Version;
  ISCSI_LOGIN_OPTIONS_INFO_SPECIFIED InformationSpecified;
  ISCSI_LOGIN_FLAGS LoginFlags;
  ISCSI_AUTH_TYPES AuthType;
  ISCSI_DIGEST_TYPES HeaderDigest;
  ISCSI_DIGEST_TYPES DataDigest;
  ULONG MaximumConnections;
  ULONG DefaultTime2Wait;
  ULONG DefaultTime2Retain;
  ULONG UsernameLength;
  ULONG PasswordLength;
  PUCHAR Username;
  PUCHAR Password;
} ISCSI_LOGIN_OPTIONS,  *PISCSI_LOGIN_OPTIONS;
<!--CodeE-->
<!--CodeS-->
_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-->
5  COMMENTS
  • Profile
    최용일 2008.10.29 22:02
    [질문1]
    function AddIScsiSendTargetPortal(InitiatorName: PTCHAR; InitiatorPortNumber: ULONG, LoginOptions: PISCI_LOGIN_OPTIONS,
    SecurityFlags: ISCSI_SECURITY_FLAGS, OUTPUT: ISCSI_OUTPUT, Portal: PISCSI_TARGET_PORTAL): HRESULT; stdcall;
    [질문2]
    __in_opt, __out 등은 델파이에서는 별 의미 없습니다. 컨버팅할 때는 그냥 무시하세요.
    [질문3]
    쓰든 안쓰든 함수의 파라매터 갯수에 맞춰서 넣어주셔야 합니다. 때에 따라서 포인터형의 경우는 널(nil)을 넣어줄 수도 있겠죠...
  • Profile
    coderoad 2008.10.30 00:35
    최용일님 답변에 감사드립니다.

    한가지만 더 여쭤보겠습니다.
    DLL 호출시 아래처럼 선언했습니다.
    이 코드가 맞는것인지 모르겠습니다.

    const
    MAX_ISCSI_PORTAL_NAME_LEN = 255;
    MAX_ISCSI_PORTAL_ADDRESS_LEN = 255;
    type
    ISCSI_LOGIN_OPTIONS_INFO_SPECIFIED = ULONG;
    ISCSI_LOGIN_FLAGS = ULONG;
    ISCSI_AUTH_TYPES = Cardinal;
    ISCSI_SECURITY_FLAGS = Cardinal;
    ISCSI_DIGEST_TYPES =(ISCSI_DIGEST_TYPE_NONE,ISCSI_DIGEST_TYPE_CRC32C );

    ISCSI_TARGET_PORTAL = ^PISCSI_TARGET_PORTAL;
    PISCSI_TARGET_PORTAL = record
    SymbolicName : array[0..MAX_ISCSI_PORTAL_NAME_LEN] of PCHAR;
    Address : array[0..MAX_ISCSI_PORTAL_ADDRESS_LEN] of PCHAR;
    Socket : Byte;
    end;

    ISCSI_LOGIN_OPTIONS = ^PISCSI_LOGIN_OPTIONS;
    PISCSI_LOGIN_OPTIONS = record
    Version : ULONG;
    InformationSpecified : ISCSI_LOGIN_OPTIONS_INFO_SPECIFIED;
    LoginFlags : ISCSI_LOGIN_FLAGS;
    AuthType : ISCSI_AUTH_TYPES;
    HeaderDigest : ISCSI_DIGEST_TYPES;
    DataDigest : ISCSI_DIGEST_TYPES;
    MaximumConnections : ULONG;
    DefaultTime2Wait : ULONG;
    DefaultTime2Retain : ULONG;
    UsernameLength : ULONG;
    PasswordLength : ULONG;
    Username : PUCHAR;
    Password : PUCHAR;
    end;

    TdllFunction = function (
    InitiatorName : PCHAR;
    InitiatorPortNumber : ULONG;
    LoginOptions : PISCSI_LOGIN_OPTIONS;
    SecurityFlags : ISCSI_SECURITY_FLAGS;
    Portal : PISCSI_TARGET_PORTAL
    ) : HRESULT; stdcall;

    // LoginOptions : PISCSI_LOGIN_OPTIONS;
    // SecurityFlags : ISCSI_SECURITY_FLAGS;
    // Portal : PISCSI_TARGET_PORTAL
    // 이 부분을 어떻게 파라메터를 넘겨야 될까요?
    // 그리고 리턴값은 어떻게 받아야 하나요?
    // stdcall이 아닌 cdecl로 하면 어떻게 되는지요..

    var
    H : THandle;
    dllFunction : TdllFunction;
    dllFileName : String;
    begin
    dllFileName := 'dll.dll';
    H := LoadLibrary( PChar( dllFileName ) );

    if H < 32 then
    begin
    ShowMessage( 'DLL 함수를 찾을 수 없습니다!' );
    Exit;
    end;

    @dllFunction := GetProcAddress( H, PChar( 'LOGIN' ) );
    if @dllFunction = nil then
    begin
    ShowMessage( 'DLL 함수 Address를 가져오지 못함!' );
    Exit;
    end
    else
    begin
    dllFunction ( 'A',
    80,
    ISCSI_LOGIN_OPTIONS, <-- 컴파일 오류 생김
    ISCSI_SECURITY_FLAGS,
    ISCSI_TARGET_PORTAL );
    end;
    FreeLibrary( H );
    end;
  • Profile
    최용일 2008.10.30 05:01
    다른 부분은 모르겠구요... 넘 길어서...
    "컴파일 오류 생김"이라는 부분... 당연히 변수선언하시고 그 변수를 넣어주셔야죠...

    var
    LoginOptions: ISCSI_LOGIN_OPTIONS
    SecurityFlags: ISCSI_SECURITY_FLAGS;
    TargetPortal: ISCSI_TARGET_PORTAL;
    begin
    ......
    dllFunction('A', 80, LoginOptions, SecurityFlags, TargetPortal);
    .....
    end;

    제가 DLL 스펙을 본게 아니라서 함수 호출을 위한 메모리관리쪽은 잘 모르겠군요...
  • Profile
    최용일 2008.10.30 05:05
    아참 함수 프로토타입에 HRESULT WINAPI AddIScsiSendTargetPortal(... 와 같이 적혀 있는데 WINAPI가 stdcall을 뜻하는 것입니다.
    stdcall과 cdecl은 약간 다른 방식이구요. 더 자세한 것은 델파이 헬프의 "Calling conventions"부분을 찾아보세요.
  • Profile
    coderoad 2008.10.30 06:26
    뭐라고 감사하다는 말씀을 드려야 할지.
    바쁘신데도 많은 관심을 가져 주셔서 고맙습니다.
    • 꼬꼬마
    • 2008.11.01 00:05
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 소울해커
      2008.11.01 02:58
      어렵게 생각할게 없는 부분긴거 같습니다만... 데이터를 가공한다는 건 즉, 데이터를 변경한다는 소...
    • 꼬꼬마
    • 2008.11.01 02:12
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 소울해커
      2008.11.01 03:58
      ..
    • 꼬꼬마
      2008.11.04 05:32
      ...
    • 이강석
    • 2008.10.31 23:48
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 아르스
    • 2008.10.31 22:17
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2008.11.01 03:37
      음.. 그냥 DB에 임원 전용 컴퓨터 이름과 IP를 저장해 놓고, 임원 컴퓨터인지 사원 컴퓨터인지 확인해서 ...
    • 아르스
      2008.11.01 20:08
      매번 답변 감사드립니다 ^^ IP를 DHCP를 써서 그런지 자주 바뀌더라구요...(아무리 DHCP라도 사용자 ...
    • 배정은
    • 2008.10.31 21:40
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 소울해커
      2008.11.01 03:27
      StringGrid에 마우스 휠을 위한 이벤트 핸들러가 있답니다. procedure TForm1.StringGrid1MouseWheelD...
    • 배정은
      2008.11.01 04:00
      잘되네요. 감사합니다.
    • 아르스
    • 2008.10.31 21:25
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.10.31 21:53
      Ctrl+Shift+G
    • 아르스
      2008.10.31 21:56
      감사합니다 ^^
    • 아폴론
    • 2008.10.31 20:48
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 퀀텀
    • 2008.10.31 19:39
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.10.31 21:21
      퀀텀그리드에 있는 헬프파일을 보세요. 거기 튜터리얼항목을 보시면 처음부터 하나하나 어떻게 만드는지 ...
    • 박재환
    • 2008.10.30 19:00
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.10.30 19:31
      ChangeDir메소드로 경로를 변경하시면 됩니다. ... IdFtp1.ChangeDir('\aaaa\YY\MM\'); IdFtp1.Get('A...
    • 박재환
      2008.10.30 22:43
      감사합니다. 그럼 한가지 더 여쭤볼께요. 예를들어.. \aaaa\YY\MM\aaa19.txt 를 aaa20081019.txt로...
    • 최용일
      2008.10.30 22:59
      음.. 그냥 이름 그대로 쓰면 되지 않나요? IdFtp1.Get('aaa19.txt', 'c:\AAA\data\aaa20081019.txt); ...
    • 박재환
      2008.10.30 23:02
      아 그게 제가 왜 그러냐면...매일매일 날짜가 바뀝니다.... 파일옆에 19는 날짜입니다. 이궁...
    • 박재환
      2008.10.30 23:21
      감사합니다. 처리 됐습니다. 방식을 다르게 했습니다. Change 디렉토리로했는데 안되더군요. 그래서 이...
    • 김명진
    • 2008.10.30 03:10
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2008.10.30 05:04
      BCC := STX xor Om xor Cm xor Pm; 이렇게 하면 되는거 아닌가요? ETX는 빼야 할겁니다.
    • genius
    • 2008.10.30 01:54
    • 0 COMMENTS
    • /
    • 0 LIKES
    • Jackie
    • 2008.10.29 21:44
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 장성호
      2008.10.29 22:57
      1. 프로그램 실행 ShellExecute(ShellExecuteEx) 또는 CreateProcess를 이용하여.. 2. 프...
    • 피류
    • 2008.10.29 21:08
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 피류
      2008.10.29 21:16
      해결 하였습니다. Build 하고 난 다음에 Install 하는 거였군요 !! ^^
    • 장윤성
    • 2008.10.29 20:44
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.10.29 21:48
      날짜형으로 변경해서 15를 더하세요. var DateText: string; DateVar: TDateTime; begin ...
    • 장윤성
      2008.10.30 00:52
      최용일님 정말 감사드립니다. 아주 잘됩니다!! ^^
    • 이강석
      2008.10.29 21:00
      소스 상에 쓰레드를 썼는데...이 놈을 Create하는 부분을 막으니깐..종료가 되네요...ㅠㅠ 왜 그러지..ㅠㅠ
    • 이강석
      2008.10.30 23:51
      쓰레드 문제였네요
    • coderoad
    • 2008.10.29 09:52
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.10.29 22:02
      [질문1] function AddIScsiSendTargetPortal(InitiatorName: PTCHAR; InitiatorPortNumber: ULONG, Logi...
    • coderoad
      2008.10.30 00:35
      최용일님 답변에 감사드립니다. 한가지만 더 여쭤보겠습니다. DLL 호출시 아래처럼 선언했습니다. 이 ...
    • 최용일
      2008.10.30 05:01
      다른 부분은 모르겠구요... 넘 길어서... "컴파일 오류 생김"이라는 부분... 당연히 변수선언하시고 그 ...
    • 최용일
      2008.10.30 05:05
      아참 함수 프로토타입에 HRESULT WINAPI AddIScsiSendTargetPortal(... 와 같이 적혀 있는데 WINAPI가 s...
    • coderoad
      2008.10.30 06:26
      뭐라고 감사하다는 말씀을 드려야 할지. 바쁘신데도 많은 관심을 가져 주셔서 고맙습니다.
    • 이승용
    • 2008.10.29 00:45
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2008.10.29 01:03
      음 알바구하시는거라면 구인구직이나 자유게시판을 이용하시는 것 을 나을 듯 싶네요. 오픈소스로 되...
    • 라벤더
      2008.10.30 01:49
      여기랑 자유게시판이랑 지역별모임 게시판이랑 세 군데나 올리셨네요...;