Win32 API를 사용하여 USB 드라이브를 안전하게 제거하시겠습니까?
Win32 API를 사용하여 USB 드라이브를 제거하려면 어떻게 해야 합니까?저는 임베디드 시스템에서 많은 일을 하는데, 그 중 하나에서 USB 스틱에 프로그램을 복사하여 대상 하드웨어에 삽입해야 합니다.
저는 주로 콘솔 작업을 하기 때문에 마우스를 사용하고 하루에 작은 작업 표시줄 아이콘을 100번 클릭하는 것을 좋아하지 않습니다.
나는 그것을 내 makefile에 넣을 수 있도록 정확히 하기 위해 작은 프로그램을 작성하고 싶지만, 나는 같은 작업을 하는 API 호출을 찾지 못했습니다.
무슨 생각 있어요?
사용할 수 있습니다.CM_Request_Device_Eject()
기능은 물론 다른 가능성도 있습니다.다음 프로젝트 및 기사 참조:
DevEject:직설적인.http://www.withopf.com/tools/deveject/
유용한 CodeProject 기사: http://www.codeproject.com/KB/system/RemoveDriveByLetter.aspx
동기화를 통해 -e를 지정하여 이동식 드라이브를 꺼낼 수 있습니다.win32 API는 아니지만, 당신은 아마 그냥 전화를 할 수 있을 것입니다.sync -e [drive_letter]
당신의 메이크 파일에서.
다음은 이동식 저장 매체에 대한 기술 기사입니다.찾다DismountNtmsMedia
.
여기 델파이의 솔루션이 있습니다. 제가 대규모 기업에서 사용할 수 있도록 서비스를 수정하고 적용한 것입니다.이동: 링크 텍스트
scapi(Setup & Config Manager API)를 찾아 다운로드 합니다.당신이 가는 길을 알려줄 'USBView'라는 데모 프로그램이 있을 것입니다.델파이가 있는 경우에는 USB 장치에 대한 정보를 수집하는 데 사용할 수 있는 TUSB DeviceTree 구성 요소도 포함됩니다.
안부 전해요
#include<SetupAPI.h>
#include <windows.h>
#include<initguid.h>
#include <newdev.h>
#include <Cfgmgr32.h>
#pragma comment(lib, "Cfgmgr32.lib")
#pragma comment(lib, "Setupapi.lib")
#pragma comment(lib, "Newdev.lib")
int RemoveDevice(const GUID *guid, const wchar_t *hwID) {
HDEVINFO m_hDevInfo;
SP_DEVICE_INTERFACE_DATA spdid;
SP_DEVINFO_DATA spdd;
DWORD dwSize;
BYTE Buf[1024];
PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd =
(PSP_DEVICE_INTERFACE_DETAIL_DATA)Buf;
printf("try to remove device::%ws\n", hwID);
m_hDevInfo = SetupDiGetClassDevs(guid, NULL, NULL, DIGCF_PRESENT| DIGCF_DEVICEINTERFACE);
if (m_hDevInfo == INVALID_HANDLE_VALUE)
{
printf("GetClassDevs Failed!\n");
return 0;
}
spdid.cbSize = sizeof(spdid);
for (int i = 0; SetupDiEnumDeviceInterfaces(m_hDevInfo, NULL, guid, i, &spdid); i++) {
dwSize = 0;
SetupDiGetDeviceInterfaceDetail(m_hDevInfo,
&spdid, NULL, 0, &dwSize, NULL);
if (dwSize != 0 && dwSize <= sizeof(Buf)) {
pspdidd->cbSize = sizeof(*pspdidd); // 5 Bytes!
ZeroMemory((PVOID)&spdd, sizeof(spdd));
spdd.cbSize = sizeof(spdd);
long res =
SetupDiGetDeviceInterfaceDetail(m_hDevInfo, &
spdid, pspdidd,
dwSize, &dwSize,
&spdd);
if (res) {
OLECHAR* guidString;
OLECHAR* guidString2;
StringFromCLSID(&spdd.ClassGuid, &guidString);
StringFromCLSID(&spdid.InterfaceClassGuid, &guidString2);
printf("%d, %ws, %ws, %ws\n", spdd.DevInst, pspdidd->DevicePath, guidString, guidString2);
CoTaskMemFree(guidString);
CoTaskMemFree(guidString2);
if (!memcmp(pspdidd->DevicePath, hwID, 2 * lstrlenW(hwID))) {
DEVINST DevInstParent = 0;
res = CM_Get_Parent(&DevInstParent, spdd.DevInst, 0);
for (long tries = 0; tries < 10; tries++) {
// sometimes we need some tries...
WCHAR VetoNameW[MAX_PATH];
PNP_VETO_TYPE VetoType = PNP_VetoTypeUnknown;
VetoNameW[0] = 0;
res = CM_Request_Device_EjectW(DevInstParent,
&VetoType, VetoNameW, MAX_PATH, 0);
if ((res == CR_SUCCESS &&
VetoType == PNP_VetoTypeUnknown)) {
printf("remove %ws success!\n", pspdidd->DevicePath);
SetupDiDestroyDeviceInfoList(m_hDevInfo);
return 1;
}
Sleep(500); // required to give the next tries a chance!
}
break;
}
}
}
}
printf("Remove Device Failed!\n");
SetupDiDestroyDeviceInfoList(m_hDevInfo);
return 0;
}
int main(){
GUID GUID_DEVINTERFACE_USB_HUB;
CLSIDFromString(L"F18A0E88-C30C-11D0-8815-00A0C906BED8", &GUID_DEVINTERFACE_USB_HUB);
RemoveDevice(&GUID_DEVINTERFACE_USB_HUB, L"\\\\?\\usb#root_hub30");
return 0;
}
참조:
언급URL : https://stackoverflow.com/questions/85649/safely-remove-a-usb-drive-using-the-win32-api
'programing' 카테고리의 다른 글
MySQL 데이터베이스에 값이 있는지 확인하는 방법 (0) | 2023.10.09 |
---|---|
jQuery로 JSON ajax 요청에서 404의 함수를 콜백하는 방법은 무엇입니까? (0) | 2023.10.09 |
REST API를 이용하여 우커머스의 모든 제품 가져오기 (0) | 2023.10.09 |
가상 상자 오라클 상자에 파일을 복사하는 방법 (0) | 2023.10.09 |
'...'의 조인 유형은 무엇입니까?A인 곳에아이디 = B.아이디(+) (0) | 2023.10.09 |