高人帮看看,MSDN上的C代码为什么在我机器上不起作用?

ynduanlian ynduanlian 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
代码源自: http://support.microsoft.com/kb/165721/zh-cn

我在BCB中建立了一个控制台程序:
#include <windows.h>
#include <winioctl.h>
#include <tchar.h>
#include <stdio.h>

// Prototypes

BOOL EjectVolume(TCHAR cDriveLetter);

HANDLE OpenVolume(TCHAR cDriveLetter);
BOOL LockVolume(HANDLE hVolume);
BOOL DismountVolume(HANDLE hVolume);
BOOL PreventRemovalOfVolume(HANDLE hVolume, BOOL fPrevent);
BOOL AutoEjectVolume(HANDLE hVolume);
BOOL CloseVolume(HANDLE hVolume);

LPTSTR szVolumeFormat = TEXT("\\\\.\\%c:");
LPTSTR szRootFormat = TEXT("%c:\\");
LPTSTR szErrorFormat = TEXT("Error %d: %s\n");

void ReportError(LPTSTR szMsg)
{
_tprintf(szErrorFormat, GetLastError(), szMsg);
}

HANDLE OpenVolume(TCHAR cDriveLetter)
{
HANDLE hVolume;
UINT uDriveType;
TCHAR szVolumeName[8];
TCHAR szRootName[5];
DWORD dwAccessFlags;

wsprintf(szRootName, szRootFormat, cDriveLetter);

uDriveType = GetDriveType(szRootName);
switch(uDriveType) {
case DRIVE_REMOVABLE:
dwAccessFlags = GENERIC_READ | GENERIC_WRITE;
break;
case DRIVE_CDROM:
dwAccessFlags = GENERIC_READ;
break;
default:
_tprintf(TEXT("Cannot eject. Drive type is incorrect.\n"));
return INVALID_HANDLE_VALUE;
}

wsprintf(szVolumeName, szVolumeFormat, cDriveLetter);

hVolume = CreateFile( szVolumeName,
dwAccessFlags,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL );
if (hVolume == INVALID_HANDLE_VALUE)
ReportError(TEXT("CreateFile"));

return hVolume;
}

BOOL CloseVolume(HANDLE hVolume)
{
return CloseHandle(hVolume);
}

#define LOCK_TIMEOUT 10000 // 10 Seconds
#define LOCK_RETRIES 20

BOOL LockVolume(HANDLE hVolume)
{
DWORD dwBytesReturned;
DWORD dwSleepAmount;
int nTryCount;

dwSleepAmount = LOCK_TIMEOUT / LOCK_RETRIES;

// Do this in a loop until a timeout period has expired
for (nTryCount = 0; nTryCount < LOCK_RETRIES; nTryCount++) {
if (DeviceIoControl(hVolume,
FSCTL_LOCK_VOLUME,
NULL, 0,
NULL, 0,
&dwBytesReturned,
NULL))
return TRUE;

Sleep(dwSleepAmount);
}

return FALSE;
}

BOOL DismountVolume(HANDLE hVolume)
{
DWORD dwBytesReturned;

return DeviceIoControl( hVolume,
FSCTL_DISMOUNT_VOLUME,
NULL, 0,
NULL, 0,
&dwBytesReturned,
NULL);
}

BOOL PreventRemovalOfVolume(HANDLE hVolume, BOOL fPreventRemoval)
{
DWORD dwBytesReturned;
PREVENT_MEDIA_REMOVAL PMRBuffer;

PMRBuffer.PreventMediaRemoval = fPreventRemoval;

return DeviceIoControl( hVolume,
IOCTL_STORAGE_MEDIA_REMOVAL,
&PMRBuffer, sizeof(PREVENT_MEDIA_REMOVAL),
NULL, 0,
&dwBytesReturned,
NULL);
}

AutoEjectVolume(HANDLE hVolume)
{
DWORD dwBytesReturned;

return DeviceIoControl( hVolume,
IOCTL_STORAGE_EJECT_MEDIA,
NULL, 0,
NULL, 0,
&dwBytesReturned,
NULL);
}

BOOL EjectVolume(TCHAR cDriveLetter)
{
HANDLE hVolume;

BOOL fRemoveSafely = FALSE;
BOOL fAutoEject = FALSE;

// Open the volume.
hVolume = OpenVolume(cDriveLetter);
if (hVolume == INVALID_HANDLE_VALUE)
return FALSE;

// Lock and dismount the volume.
if (LockVolume(hVolume) && DismountVolume(hVolume)) {
fRemoveSafely = TRUE;

// Set prevent removal to false and eject the volume.
if (PreventRemovalOfVolume(hVolume, FALSE) &&
AutoEjectVolume(hVolume))
fAutoEject = TRUE;
}

// Close the volume so other processes can use the drive.
if (!CloseVolume(hVolume))
return FALSE;

if (fAutoEject)
printf("Media in Drive %c has been ejected safely.\n",
cDriveLetter);
else {
if (fRemoveSafely)
printf("Media in Drive %c can be safely removed.\n",
cDriveLetter);
}

return TRUE;
}

void Usage()
{
printf("Usage: Eject <drive letter>\n\n");
return ;
}

void main(int argc, char * argv[])
{
if (argc != 2) {
Usage();
return ;
}

if (!EjectVolume(argv[1][0]))
printf("Failure ejecting drive %c.\n", argv[1][0]);

return ;
}


我的USB盘为“G”盘,
编译后我执行:
Project1.exe G
结果显示:Media in Drive G has been ejected safely.
但我到我的电脑中看见,这个“G”盘依然存在,还能打开访问里面的内容,为什么会这样?

...全文

相关推荐

msdn-Microsoft C++、C 和汇编程序文档【2022年11月12日最新更新】

总之,C++、C和汇编语言各有其独特之处,它们在不同的应用场景中发挥着重要作用。MSDN文档是开发者学习和精通这些语言的重要参考资料,通过深入研究,可以提升编程技能,解决复杂问题。

axecute

MSDN精简版:C++编程离线资源包

MSDN(Microsoft Developer Network)的历史可以追溯到1990年代,当时它是为了支持Visual Studio产品的发布而创立的。随着时间的推移,MSDN文档库逐渐演化成为微软官方提供给开发者学习和参考的综合性平台。通过不断更新和扩充,它现在包含了详尽的API参考、开发文档、工具、教程和示例代码等资源,不仅帮助开发者掌握微软技术,也促进了技术交流和创新。精简版MSDN是微软为了方便开发者在有限的网络条件和存储空间下使用MSDN文档库而推出的解决方案。

Paula-柒月拾

[MSDN杂志] MSDN Magazine 2017年03月刊

本摘要介绍了《MSDN Magazine》2017年3月刊的主要内容,包括源代码验证、智能聊天机器人开发、设计模式优化、C++安全数组编程、不可变集合等技术文章,以及专栏如网络失误预防、软更新技术、C

CSLATech

[MSDN杂志] MSDN Magazine 2017年01月刊

本文总结了2017年1月刊《MSDN Magazine》的技术内容,包括C++/WinRT介绍、LUIS自然语言交互、HoloLens空间映射、Release Management自动化部署及CNTK

CSLATech

windows 命令ping的C源代码

描述中提到,这个程序的主要源代码是从微软开发者网络(MSDN)获取的。MSDN是微软提供的一个资源库,包含了大量关于Windows操作系统、开发工具和API的文档和技术资料。

zhongyj
评论 4
收藏 已收藏
分享
返回顶部
ynduanlian
C++ 语言 65,214 成员 250,514 内容