dポイントプレゼントキャンペーン実施中!

windows2000
vc++6.0

ユーザーにドライブを指定させてファイルをCDに焼く機能を追加したいと考えています。
cdrecordを使ってできないかと考えているんですが、デバイス識別子(x,x,x)は、-scanbusを見て判断するしかないんでしょうか?ドライブ名から得る方法がありましたら教えてください。

他にもっといいCDに焼く方法がありましたらアドバイスお願いします。
よろしくお願いします。

A 回答 (1件)

 こんばんは。


 其れは、DeviceIOControl()APIで行うのではないでしょうか。例えばCD/DVDドライブからシリアル番号等を取るには

#define _WINIOCTL_
#include<windows.h>
#undef _WINIOCTL_
#include<devioctl.h>
#include<ntdddisk.h>
#include<ntddser.h>
#include<ntddmou.h>

int main()
{
//CD/DVDドライブを開く
HANDLE hDrive = CreateFile("\\\\.\\D:", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL) ;
if(INVALID_HANDLE_VALUE != hDrive)
{
CHAR buffer[2048];
ULONG returned = 0;

STORAGE_PROPERTY_QUERY spq;
spq.PropertyId = StorageDeviceProperty;
spq.QueryType= PropertyStandardQuery;

BOOL status = ::DeviceIoControl(hDrive, IOCTL_STORAGE_QUERY_PROPERTY, &spq, sizeof(spq), buffer, sizeof(buffer), &returned, 0) ;
if (status)
{
STORAGE_DEVICE_DESCRIPTOR* pSDD = (STORAGE_DEVICE_DESCRIPTOR*)buffer;
//ベンダ名
char* pszVenderId = pSDD->VendorIdOffset? &buffer[pSDD->VendorIdOffset] : NULL;
//ドライブ名
char* pszProductId = pSDD->ProductIdOffset ? &buffer[pSDD->ProductIdOffset] : NULL;
//リビジョン
char* pszRevision = pSDD->ProductRevisionOffset ? &buffer[pSDD->ProductRevisionOffset] : NULL;
//シリアル番号
char* pszSerialNumber = pSDD->SerialNumberOffset ? &buffer[pSDD->SerialNumberOffset] : NULL;
pSDD->
}
}

::CloseHandle(hDrive);
return 0;
}

 の様に成ります。バスの番号を取る方法は分かりませんが、上記のDeviceIOControl()APIで出来ると思います(CD/DVD/ブルーレイに焼き付けるのもDeviceIOControl()API)。
 また、CD/DVDのリードライトのソフトでソースを公開しているのは「InfraRecorder」や「CDマニュピレータ」と言った所です。
 DeviceIOControl()APIを使用する為に「WindowsDDK/WDK」をダウンロードする必要が有ります。
 尚、DeviceIOControl()APIは危険な物でもあるので、使用する際には十分に注意した方が良いと思います。
    • good
    • 0
この回答へのお礼

お礼が大変遅くなりました。すいません。
かなり難しそうですが挑戦してみます。
ありがとうございます。

お礼日時:2009/07/12 22:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!