http://d.hatena.ne.jp/kaorun55/20080210/1202580779で書いたデバイス情報の取得をBorland C++ Builder(BCB)で実行しようとするとエラーになるとの指摘を受けた。
なんとか環境を作って調べてみたら、プロパティを要求するための STORAGE_PROPERTY_QUERY 構造体のサイズがなぜか3となっていた(sizeofで取得)。
正常に動作する環境では12となる。
このため正常な要求が発行されないのでエラーとなったようだ。
とりあえずの処置としてDeviceIoControl周辺を下記のようにしたところ正常に動作した。
unsigned char inbuffer[24] = { 0 }; STORAGE_PROPERTY_QUERY *sPQ = (STORAGE_PROPERTY_QUERY *)inbuffer; sPQ->PropertyId = StorageDeviceProperty; sPQ->QueryType = PropertyStandardQuery; ret = ::DeviceIoControl( hDevice, IOCTL_STORAGE_QUERY_PROPERTY, sPQ, 12, sdd, sizeof(buffer), &dwRet, 0 );
メンバそれぞれのサイズはきちんと取得できるのに、なぜか構造体全体で取ろうとするとおかしくなる。
ちなみにBorland C Compiler(BCC)だと、このような問題もなく正常に動作した。
原因は分からず終い。。。