제가 봤을땐 조금 다르게 고쳐야 할듯 합니다.
우선 C 함수 원형을 보면 TDiskList라는 record에 데이터를 채워 리턴 해주는 것 같고, 뒤에 ErrorCode에서는 에러코드가 채워지는 거 같네요. 그렇다면...
function SKY_ScanSupportedDisk(var DiskList:TDiskList;var dwErrorode:DWORD):DWORD; stdcall; external 'SkyUSBD.dll';
소스도 너무 복잡하게 하지말고 그냥 local 변수로 선언해서..
var
sDiskList : TDiskList;
dwError:DWORD;
Count:DWORD;
begin
FillChar(sDiskLIst, SizeOf(TDiskList), #0);
Count:=SKY_ScanSupportedDisk(sDiskLIst,Error);
/// 뒤에서는 sDiskList를 원하는대로 써먹는 코드 줄줄줄...
end;
GomSun2 님이 쓰신 글 :
: C문법을 몰라 델파이코드만 보고 수정했습니다.
:
: var
: sDiskList : ^TDiskList;
: Error:LPDWORD;
: Count:DWORD;
: begin
: New(sDiskList);
: try
: FillChar(sDiskLIst^, SizeOf(TDiskList), #0);
: Count:=SKY_ScanSupportedDisk(sDiskLIst,Error);
: finally
: Dispose(sDiskList); // 소멸
: end;
:
: 델초보 님이 쓰신 글 :
: : ===============================================================================================
: : 컨버팅한 function
: : function SKY_ScanSupportedDisk(var DiskList:PDiskList;lpErrorode:LPDWORD):DWORD; stdcall; external 'SkyUSBD.dll';
: : type
: : TDiskList = packed record
: : // TDiskList = record
: : DevicePath:array[0..MAX_PATH-1] of byte;
: : DeviceSN:array[0..25] of Byte;
: : DeviceType:byte;
: : Lun:byte;
: : end;
: : 델파이 변환
: : sDiskLIst : PDiskList;
: : Error:LPDWORD;
: : Count:DWORD;
: : begin
: : getMem(sDiskList, SizeOf(sDiskList)*25); // 생성
: : FillChar(sDiskLIst,sizeof(tDiskLIst)*25,$0);
: : Count:=SKY_ScanSupportedDisk(sDiskLIst,Error);=> Acess violaction 0x0000000 이나옵니다 ㅜㅜ
: : 실행후 Acess Violation
: : FreeMem(sDiskList, SizeOf(TDiskList) * 25); // 소멸
: : ===============================================================================================
: : extern "C" DWORD SKY_ScanSupportedDisk(DiskList *sDiskList, LPDWORD lpErrorode);
: : 원형함수
: : dwErrorCode LPDWORD;
: : Count integer
: : DiskList *sDiskList;
: : sDiskList = (DiskList*)malloc(sizeof(DiskList)*25);
: : memset(sDiskList, 0x00, sizeof(DiskList)*25);
: : count=SKY_ScanSupportedDisk(sDiskList, &dwErrorCode);
: :
: : 뭐가 잘못됬지는 봐주세요
|