幾段 C++ 轉 Delphi Code 是否正確 |
尚未結案
|
Snooze
一般會員 發表:18 回覆:21 積分:7 註冊:2002-06-03 發送簡訊給我 |
C
typedef struct _STORAGE_DEVICE_DESCRIPTOR {
ULONG Version;
ULONG Size;
UCHAR DeviceType;
UCHAR DeviceTypeModifier;
BOOLEAN RemovableMedia;
BOOLEAN CommandQueueing;
ULONG VendorIdOffset;
ULONG ProductIdOffset;
ULONG ProductRevisionOffset;
ULONG SerialNumberOffset;
STORAGE_BUS_TYPE BusType;
ULONG RawPropertiesLength;
UCHAR RawDeviceProperties[1]; } STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
Delphi
TSTORAGE_DEVICE_DESCRIPTOR = record
Version: longint; //4
Size: longint; //4
DeviceType: byte; //1
DeviceTypeModifier: byte; //1
RemovableMedia: BOOLEAN; //1
CommandQueueing: BOOLEAN; //1
VendorIdOffset: longint; //4
ProductIdOffset: longint; //4
ProductRevisionOffset: longint; //4
SerialNumberOffset: longint; //4
BusType: TSTORAGE_BUS_TYPE; //1
RawPropertiesLength: longint; //4
RawDeviceProperties: array of Byte;
end;
C
typedef enum _STORAGE_BUS_TYPE {
BusTypeUnknown = 0x00,
BusTypeScsi,
BusTypeAtapi,
BusTypeAta,
BusType1394,
BusTypeSsa,
BusTypeFibre,
BusTypeUsb,
BusTypeRAID,
BusTypeMaxReserved = 0x7F
} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;
Delphi
TSTORAGE_BUS_TYPE = (
BusTypeUnknown = $00,
BusTypeScsi ,
BusTypeAtapi ,
BusTypeAta,
BusType1394 ,
BusTypeSsa ,
BusTypeFibre ,
BusTypeUsb ,
BusTypeRAID ,
BusTypeMaxReserved = $7F);
以上這兩段 是否轉 對
我覺得詭異的一段 為 C 的
UCHAR RawDeviceProperties[1]; 之後 還做了new Byte的動作
C
.......
PSTORAGE_DEVICE_DESCRIPTOR pDevDesc;
.......
.......
pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) 512 - 1];
pDevDesc->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) 512 - 1;
Delphi
SetLength(pDevDesc.RawDeviceProperties, 512);
pDevDesc.Size := SizeOf(pDevDesc) 512;
這段我寫完感覺更毛了 發表人 - snooze 於 2004/05/31 18:39:34
------
Nice to meet u |
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
差挺多的你再看一下windows.pas的定義我想
ULONG應該還是等於ULONG
在WINDOWS.PAS裡的定義ULONG是^longint
typedef enum _STORAGE_BUS_TYPE {
這應該是record的 type吧
pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) 512 - 1];這在delphi好像比較像create的動作
------------------------------------
搞不懂!搞不懂!其實我也搞不懂!
|
Snooze
一般會員 發表:18 回覆:21 積分:7 註冊:2002-06-03 發送簡訊給我 |
引言: 差挺多的你再看一下windows.pas的定義我想 ULONG應該還是等於ULONG 在WINDOWS.PAS裡的定義ULONG是^longint typedef enum _STORAGE_BUS_TYPE { 這應該是record的 type吧 pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) 512 - 1];這在delphi好像比較像create的動作ULONG 似乎真的還是 ULONG typedef enum _STORAGE_BUS_TYPE 真的是record type 嗎? typedef struct xxxx 才是屬於 record type 吧... Nice to meet u
------
Nice to meet u |
cindy78
一般會員 發表:4 回覆:19 積分:4 註冊:2004-05-24 發送簡訊給我 |
|
cindy78
一般會員 發表:4 回覆:19 積分:4 註冊:2004-05-24 發送簡訊給我 |
|
Snooze
一般會員 發表:18 回覆:21 積分:7 註冊:2002-06-03 發送簡訊給我 |
引言: 我在研究和你同樣的問題,也是頭大阿。那段代碼是判斷USB的吧 在我的跟蹤調試中,VC中sizeof(STORAGE_PROPERTY_QUERY)的值為12,而在delphi中為4 這個也是sizeof(STORAGE_DEVICE_DESCRIPTOR)在VC中為40,而delphi中變成了36, 我縂覺得是參數緩衝區帶入有問題,導致DeviceIoControl返回值,出問題,我現在也很是苦惱:(沒錯 基本上 DeviceIoControl(hMyDevice, // device handle CTL_CODE(0,Dword($0500),0,0), // info of device property @Query, 12, // input data buffer @pDevDesc, pDevDesc.Size, // output data buffer dwOutBytes, // out's length nil); CTL_CODE(0,Dword($0500),0,0) 要等於 2954240 pDevDesc.Size 要等於 551 sizeof(TSTORAGE_PROPERTY_QUERY) 寫死為12 這樣就可 work 我已經寫出來曾測也正確 但function 在run 完後 到 end; 完後 跳出 --------------------------- Bustype --------------------------- UnHandle Excection :TForm1 Access violation at address 4E415551. Read of address 4E415551 --------------------------- OK --------------------------- < >< >< >< >< >< >< >< >
------
Nice to meet u |
cindy78
一般會員 發表:4 回覆:19 積分:4 註冊:2004-05-24 發送簡訊給我 |
|
Snooze
一般會員 發表:18 回覆:21 積分:7 註冊:2002-06-03 發送簡訊給我 |
|
Snooze
一般會員 發表:18 回覆:21 積分:7 註冊:2002-06-03 發送簡訊給我 |
|
cindy78
一般會員 發表:4 回覆:19 積分:4 註冊:2004-05-24 發送簡訊給我 |
|
cindy78
一般會員 發表:4 回覆:19 積分:4 註冊:2004-05-24 發送簡訊給我 |
我的已經OK了,把代碼給你
TSTORAGE_BUS_TYPE=(BusTypeUnknown=$00,
BusTypeScsi,
BusTypeAtapi,
BusTypeAta,
BusType1394,
BusTypeSsa,
BusTypeFibre,
BusTypeUsb,
BusTypeRAID,
BusTypeMaxReserved=$7F); TSTORAGE_PROPERTY_ID=(StorageDeviceProperty=0,
StorageAdapterProperty,
StorageDeviceIdProperty);
TSTORAGE_QUERY_TYPE=(PropertyStandardQuery=0,
PropertyExistsQuery,
PropertyMaskQuery,
PropertyQueryMaxDefined); type
TSTORAGE_PROPERTY_QUERY=Packed record
PropertyId:TSTORAGE_PROPERTY_ID;
QueryType:TSTORAGE_QUERY_TYPE;
AdditionalParameters:array[0..1] of Byte;
end; TSTORAGE_DEVICE_DESCRIPTOR=packed record
Version:ULong;
Size:ULong;
DeviceType:UChar;
DeviceTypeModifier:UChar;
RemovableMedia:Boolean;
CommandQueueing:Boolean;
VendorIdOffset:ULong;
ProductIdOffset:ULong;
ProductRevisionOffset:ULong;
SerialNumberOffset:ULong;
BusType:TSTORAGE_BUS_TYPE;
RawPropertiesLength:ULong;
RawDeviceProperties:array of UChar;
end;
PSTORAGE_DEVICE_DESCRIPTOR=^TSTORAGE_DEVICE_DESCRIPTOR;//注意定義了指針 procedure TForm1.Button1Click(Sender: TObject);
var
len:DWORD;
buffer:PChar;
i:integer;
panfu:PChar;
tt:string;
dw:DWORD;
DirList:TstringList;
flag:integer;
free,total:int64;
totalfree:PLargeInteger;
tp:textfile;
j:integer;
TextName:string;
GetSysDir:string;
hDevice:THANDLE;
szBuf:Pchar;
tempstring:string;
ss:string;
SCIP : TSendCmdInParams;
aIdOutCmd : PSTORAGE_DEVICE_DESCRIPTOR;//是指針
//IdOutCmd : TSendCmdOutParams absolute aIdOutCmd;
cbBytesReturned : DWORD;
abc:TSTORAGE_BUS_TYPE;
Query:TSTORAGE_PROPERTY_QUERY;
cjtest:DWord;
res:BOOLean;
be:DWORD;
sizestorge:integer;
sizeId:integer;
begin
//GetSysDir:=SysDir;
//TextName:=GetSysDir+'temp\Kall.bmp';
DirList:=TStringList.Create;
len:=254;
buffer:=Pchar(Allocmem(255));
dw:=GetLogicalDriveStrings(len,buffer);
for i:=0 to (dw div 4) do
begin DirList.Add(AnsiString(buffer));
buffer:=buffer+4;
end;
szBuf:=Pchar(allocmem(255));
for i:=0 to DirList.Count-1 do
begin PanFu:=PChar(allocmem(10));
strpcopy(panfu,DirList.Strings[i]);
case GetDriveType(panfu) of
0: flag:=0;
1 :flag:=1;
DRIVE_REMOVABLE:flag:=2;
DRIVE_FIXED:flag:=3;
DRIVE_REMOTE:flag:=4;
DRIVE_CDROM:flag:=5;
DRIVE_RAMDISK:flag:=6;
end;
tempstring:='\\?\'+copy(DirList.Strings[i],0,2);
strpcopy(szBuf,tempstring);
if true then //這裡本來是用作判斷屬性為FIXED的USB的但是爲了實驗,先改爲這樣了
begin
hDevice := CreateFile( szBuf, GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
if (hDevice<>INVALID_HANDLE_VALUE) then
begin
aIdOutCmd:=allocmem(sizeof(TSTORAGE_DEVICE_DESCRIPTOR) + 515);//給指針分配空間
Query.PropertyId:=StorageDeviceProperty;
Query.QueryType:=PropertyStandardQuery;
cbBytesReturned:=0;
cjtest:=CTL_CODE(IOCTL_STORAGE_BASE,1280, METHOD_BUFFERED, FILE_ANY_ACCESS);
SizeStorge:=SizeOf(TSTORAGE_PROPERTY_QUERY);
aIdOutCmd^.Size:= SizeOf(TSTORAGE_DEVICE_DESCRIPTOR)+515;
res:= DeviceIoControl( hDevice,cjtest ,@Query,12,aIdOutCmd,aIdOutCmd^.Size,cbBytesReturned, nil );
if res then
begin
abc:=aIdOutCmd^.BusType;
case abc of
BusTypeUnknown:begin Form1.Memo1.lines.add(tempstring+'BusTypeUnknown');end;
BusTypeScsi: begin Form1.memo1.lines.add(tempstring+'BusTypeScsi');end;
BusTypeAtapi:begin Form1.memo1.lines.add(tempstring+'BusTypeAtapi');end;
BusTypeAta:begin Form1.memo1.lines.add(tempstring+'BusTypeAta');end;
BusType1394:begin Form1.memo1.lines.add(tempstring+'BusType1394');end;
BusTypeSsa:begin Form1.memo1.lines.add(tempstring+'BusTypeSsa');end;
BusTypeFibre:begin Form1.memo1.lines.add(tempstring+'BusTypeFibre');end;
BusTypeUsb:begin Form1.memo1.lines.add(tempstring+'BusTypeUsb');end;
BusTypeRAID:begin Form1.memo1.lines.add(tempstring+'BusTypeRAID');end;
BusTypeMaxReserved:begin Form1.memo1.lines.add(tempstring+'BusTypeMaxReserved');end;
//showmessage(tempstring);
end;
end;
//be:=GetLastError;
//CloseHandle(hDevice);
end;
//delete pDevDesc;
CloseHandle(hDevice);
end; end; end; 這是試驗代碼,還有沒有完善的地方,不過基本功能實現了:)
齊心合力,終于解決了,呵呵 發表人 - cindy78 於 2004/06/02 16:51:28
|
Snooze
一般會員 發表:18 回覆:21 積分:7 註冊:2002-06-03 發送簡訊給我 |
|
cindy78
一般會員 發表:4 回覆:19 積分:4 註冊:2004-05-24 發送簡訊給我 |
|
cindy78
一般會員 發表:4 回覆:19 積分:4 註冊:2004-05-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |