Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

USBストレージの取り出しについて

571 views
Skip to first unread message

yupapa

unread,
Feb 5, 2004, 7:25:56 AM2/5/04
to
プログラミングに関する件なのでこちらのNGに投稿いたします。
WindowsXPなどUSB対応のOSではCFリーダ/ライタを繋ぐとリムーバブルメディアとし
て自動認識されると思います。これを取り外すときはキャッシュに残ったデータを安
全に書き戻すために、エクスプローラで右クリックにて「取り出し」を行った後、CF
リーダ/ライタをはずします。これをプログラム上から「取り出し」と同じことを行
いたいと思いますがどなたかサンプルコードなどご存知でしたら教えてください。


Kaoru Kodaka

unread,
Feb 5, 2004, 4:12:41 PM2/5/04
to
かおく です。

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/"

HOSOKAWA

unread,
Feb 5, 2004, 9:45:24 PM2/5/04
to
細川と申します。

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リーダ/ライタを繋ぐとリムーバブルメディアと

> て自動認識されると思います。これを取り外すときはキャッシュに残ったデータを

yupapa

unread,
Feb 9, 2004, 8:13:21 AM2/9/04
to
早々のご回答ありがとうございます。先週末インフルエンザで寝込み回答が遅れまし
た。
支障なければDLL送っていただけますか?(インフルエンザで他力本願モードです)
"HOSOKAWA" <H_HID...@hotmail.com> wrote in message
news:OI459sF7...@tk2msftngp13.phx.gbl...
0 new messages