線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2209
推到 Plurk!
推到 Facebook!

幾段 C++ 轉 Delphi Code 是否正確

尚未結案
Snooze
一般會員


發表:18
回覆:21
積分:7
註冊:2002-06-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-31 18:36:33 IP:61.220.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-31 19:01:54 IP:61.221.xxx.xxx 未訂閱
差挺多的你再看一下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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-01 10:20:30 IP:61.220.xxx.xxx 未訂閱
引言: 差挺多的你再看一下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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-01 16:19:59 IP:219.140.xxx.xxx 未訂閱
我在研究和你同樣的問題,也是頭大阿。那段代碼是判斷USB的吧 在我的跟蹤調試中,VC中sizeof(STORAGE_PROPERTY_QUERY)的值為12,而在delphi中為4 這個也是sizeof(STORAGE_DEVICE_DESCRIPTOR)在VC中為40,而delphi中變成了36, 我縂覺得是參數緩衝區帶入有問題,導致DeviceIoControl返回值,出問題,我現在也很是苦惱:(
cindy78
一般會員


發表:4
回覆:19
積分:4
註冊:2004-05-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-06-01 16:23:10 IP:219.140.xxx.xxx 未訂閱
忘了一句,我把ULong 轉成Cardinal了,不是32位無符號整數嗎。
Snooze
一般會員


發表:18
回覆:21
積分:7
註冊:2002-06-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-01 18:06:19 IP:61.220.xxx.xxx 未訂閱
引言: 我在研究和你同樣的問題,也是頭大阿。那段代碼是判斷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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-06-02 09:15:08 IP:219.140.xxx.xxx 未訂閱
我知道在VC中那個是551,可是問題是如何讓他等於551呢?按照你的代碼,或是我自己的代碼(和你差不多了:))怎麽都是546 幫忙貼一下吧:)
Snooze
一般會員


發表:18
回覆:21
積分:7
註冊:2002-06-03

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-06-02 09:48:39 IP:61.220.xxx.xxx 未訂閱
我是把他補足511  < >< > >
------
Nice to meet u
Snooze
一般會員


發表:18
回覆:21
積分:7
註冊:2002-06-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-06-02 11:29:30 IP:61.220.xxx.xxx 未訂閱
採用避掉錯誤的方式 Button1Click 完後 會出現錯誤 如果您把 Application.OnException := EdwardSaveU; remark 就可以看到access violation 的東西 而且我發現 ButtonClick 內的code 隨便要再加上 show GetDriveType(PChar(sDrvLetter)) 的類型 就會不work 快瘋掉了
------
Nice to meet u
cindy78
一般會員


發表:4
回覆:19
積分:4
註冊:2004-05-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-06-02 15:36:33 IP:219.140.xxx.xxx 未訂閱
我覺得這段代碼出現問題是在於,pDevDesc為一個類型,他的大小為40,人爲的把它的尺寸變爲551,佔用了後面的緩衝區,肯定會有問題的。而在VC中他是把它當作指針的,並給他分配了足夠的緩衝區。奇怪的是在delphi中我也把它變爲指針后,DeviceIoControl竟然不work了:(
cindy78
一般會員


發表:4
回覆:19
積分:4
註冊:2004-05-24

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-06-02 16:19:37 IP:219.140.xxx.xxx 未訂閱
我的已經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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-06-02 19:09:57 IP:61.220.xxx.xxx 未訂閱
Ho ho .. 真是太讚了 不曉得cindy78是做哪總類別的程式開發
------
Nice to meet u
cindy78
一般會員


發表:4
回覆:19
積分:4
註冊:2004-05-24

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-06-03 08:51:59 IP:219.140.xxx.xxx 未訂閱
我一直用delphi做數據庫的,現在沒有大項目做,做些小工具開發,周期短見效快,開拓視野吧!
cindy78
一般會員


發表:4
回覆:19
積分:4
註冊:2004-05-24

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-06-03 10:09:39 IP:219.140.xxx.xxx 未訂閱
順便問一句,你的C轉delphi用的是工具嗎?什麽名字啊,介紹一下,我每次都是自己轉的,比較辛苦,呵呵
系統時間:2024-05-15 10:41:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!