On Thu, 5 Feb 2004 21:25:56 +0900
"yupapa" <mits...@ka.tnc.ne.jp> wrote:
> これをプログラム上から「取り出し」と同じことを行いたいと思
> いますがどなたかサンプルコードなどご存知でしたら教えてくだ
> さい。
CM_Request_Device_Eject(_Ex) などでできるようです。が、かな
り面倒なので、お気楽にやりたければ、Shell の FolderItemVerb.DoIt()
とかでしょうか。
---
Dim kaok As New MVP("for .net 2003-2004.")
kaok.Web = "http://www.antoine.st/"
VC6.0ですが下記のコードでいかがでしょうか?
注.比較的新しいSDK(VC標準ではだめ)、DDKが別途必要となります。
(DLL化したものはありますので、DLL本体のみであれば無償でご提供可能です)
宜しくお願い致します。
--
細川 英正
#include <windows.h>
#include <cfgmgr32.h> // Windows DDKで提供されています。
#include <tchar.h>
#include <setupapi.h>
#include <stdio.h>
#pragma comment(lib, "cfgmgr32.lib") // cfgmgr32.libもリンクしてください
#pragma comment(lib, "setupapi.lib")
// HardwareID USB\Vid_07cc&Pid_0301&Rev_0005
static TCHAR ClassName[64] = { TEXT("USB") }; //USBクラスそ指定
static TCHAR HardwareID[128] = { TEXT("USB\\Vid_07cc&Pid_0301") };
// デバイスの識別子(この例では固定)
BOOL RemoveOK(HWND, LPTSTR, LPTSTR);
void main(int argc, char *argv[])
{
argc--;
argv++;
if (argc == 2) {
RemoveOK(NULL, argv[0], argv[1]);
} else {
printf("Usage: Eject ClassName HardwareID\n");
printf(" ex: Eject USB \"USB\\Vid_07cc&Pid_0301&Rev_0005\"\n");
RemoveOK(NULL, ClassName, HardwareID);
}
}
BOOL RemoveOK(HWND hWnd, LPTSTR pClassName, LPTSTR pHwID)
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA devInfo;
DWORD idx;
BOOL bRet;
CONFIGRET cRet;
ZeroMemory(&devInfo, sizeof(SP_DEVINFO_DATA));
devInfo.cbSize = sizeof(SP_DEVINFO_DATA);
// クラス名からGUIDを取得
bRet = SetupDiClassGuidsFromName(pClassName, &devInfo.ClassGuid, 1,
&idx);
if (bRet == FALSE)
return FALSE;
// ハードウェアIDからHDEVINFOを取得
hDevInfo = SetupDiGetClassDevs((LPGUID)&devInfo.ClassGuid,
pHwID, hWnd,
DIGCF_PRESENT | DIGCF_ALLCLASSES);
if (hDevInfo == INVALID_HANDLE_VALUE) {
printf("SetupDiGetClassDevs Error:%d\n", GetLastError());
return FALSE;
}
// デバイス情報を取得
bRet = SetupDiEnumDeviceInfo(hDevInfo, 0, &devInfo);
if (bRet == FALSE) {
printf("SetupDiEnumDeviceInfo Error:%d\n", GetLastError());
goto Get_Out_Of_Here;
}
// 安全な取り出しを行う
cRet = CM_Request_Device_Eject(devInfo.DevInst, NULL, NULL, 0, 0);
if (cRet != CR_SUCCESS) {
printf("CM_Request_Device_Eject Error:%d\n", cRet);
// cRet == 19 の場合、リトライすることが必要かもしれません。
} else {
printf("安全な取り外しが可能です。\n");
}
// Cleanup
Get_Out_Of_Here:
SetupDiDestroyDeviceInfoList(hDevInfo);
return (cRet == CR_SUCCESS);
}
/**/
> WindowsXPなどUSB対応のOSではCFリーダ/ライタを繋ぐとリムーバブルメディアと
し
> て自動認識されると思います。これを取り外すときはキャッシュに残ったデータを