PDA

View Full Version : [سوال]Remove کردن USB با استفاده از کد دلفی



__Genius__
پنج شنبه 13 اسفند 1388, 20:01 عصر
سلام.
دوستان روشی برای این کار از طریق دلفی میشناسن ؟
خارج کردن (remove) کردن یک removable drive بوسیله کد در دلفی؟
متشکرم .

سعید صابری
جمعه 14 اسفند 1388, 09:50 صبح
ببين اين بدردت ميخوره

منبع: نميدونم


function OpenVolume(ADrive: char): THandle;
var
RootName, VolumeName: string;
AccessFlags: DWORD;
DriveType:Cardinal;
begin
RootName := ADrive + ':\';
DriveType := GetDriveType(PChar(RootName));
case DriveType of
DRIVE_REMOVABLE:
AccessFlags := GENERIC_READ or GENERIC_WRITE;
DRIVE_CDROM:
AccessFlags := GENERIC_READ;
// DRIVE_FIXED:
// AccessFlags := GENERIC_READ or GENERIC_WRITE;
else
Result := INVALID_HANDLE_VALUE;
exit;
end;
VolumeName := Format('\\.\%s:', [ADrive]);
Result := CreateFile(PChar(VolumeName), AccessFlags,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if Result = INVALID_HANDLE_VALUE then
RaiseLastWin32Error;
end;

function LockVolume(AVolumeHandle: THandle): boolean;
const
LOCK_TIMEOUT = 10 * 1000; // 10 Seconds
LOCK_RETRIES = 20;
LOCK_SLEEP = LOCK_TIMEOUT div LOCK_RETRIES;

// #define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
FSCTL_LOCK_VOLUME = (9 shl 16) or (0 shl 14) or (6 shl 2) or 0;
var
Retries: integer;
BytesReturned: Cardinal;
begin
for Retries := 1 to LOCK_RETRIES do begin
Result := DeviceIoControl(AVolumeHandle, FSCTL_LOCK_VOLUME, nil, 0,
nil, 0, BytesReturned, nil);
if Result then
break;
Sleep(LOCK_SLEEP);
end;
end;

function DismountVolume(AVolumeHandle: THandle): boolean;
const
// #define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
FSCTL_DISMOUNT_VOLUME = (9 shl 16) or (0 shl 14) or (8 shl 2) or 0;
var
BytesReturned: Cardinal;
begin
Result := DeviceIoControl(AVolumeHandle, FSCTL_DISMOUNT_VOLUME, nil, 0,
nil, 0, BytesReturned, nil);
if not Result then
RaiseLastWin32Error;
end;

function PreventRemovalOfVolume(AVolumeHandle: THandle;
APreventRemoval: boolean): boolean;
const
// #define IOCTL_STORAGE_MEDIA_REMOVAL CTL_CODE(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
IOCTL_STORAGE_MEDIA_REMOVAL = ($2d shl 16) or (1 shl 14) or ($201 shl 2) or 0;
type
TPreventMediaRemoval = record
PreventMediaRemoval: BOOL;
end;
var
BytesReturned: Cardinal;
PMRBuffer: TPreventMediaRemoval;
begin
PMRBuffer.PreventMediaRemoval := APreventRemoval;
Result := DeviceIoControl(AVolumeHandle, IOCTL_STORAGE_MEDIA_REMOVAL,
@PMRBuffer, SizeOf(TPreventMediaRemoval), nil, 0, BytesReturned, nil);
if not Result then
RaiseLastWin32Error;
end;

function AutoEjectVolume(AVolumeHandle: THandle): boolean;
const
// #define IOCTL_STORAGE_EJECT_MEDIA CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
IOCTL_STORAGE_EJECT_MEDIA = ($2d shl 16) or (1 shl 14) or ($202 shl 2) or 0;
var
BytesReturned: Cardinal;
begin
Result := DeviceIoControl(AVolumeHandle, IOCTL_STORAGE_EJECT_MEDIA, nil, 0,
nil, 0, BytesReturned, nil);
if not Result then
RaiseLastWin32Error;
end;

function EjectVolume(ADrive: char): boolean;
var
VolumeHandle: THandle;
begin
Result := FALSE;
// Open the volume
VolumeHandle := OpenVolume(ADrive);
if VolumeHandle = INVALID_HANDLE_VALUE then
exit;
try
// Lock and dismount the volume
if LockVolume(VolumeHandle) and DismountVolume(VolumeHandle) then begin
// Set prevent removal to false and eject the volume
if PreventRemovalOfVolume(VolumeHandle, FALSE) then
AutoEjectVolume(VolumeHandle);
end;
finally
// Close the volume so other processes can use the dr
CloseHandle(VolumeHandle);
end;
end;

__Genius__
یک شنبه 16 اسفند 1388, 18:40 عصر
سلام متاسفانه کد مفید واقع نشد ، یا اینکه من نتونستم ازش استفاده بکنم ، من در یک Button رویداد EjectVolume رو به همراه نام درایوی که usb هست بهش دادم یعنی P به عنوان پارامر ورودی ، اتفاق خاصی نمیفته ، Error هم نمیده ... ،

__Genius__
چهارشنبه 19 اسفند 1388, 14:08 عصر
پروژه ای رو پیدا کردم که تمامی Drive های USB که به سیستم وصل هست رو Remove میکنه ، با اندکی تغییر میتونم اون چیزی که میخوام رو پیاده کنم .

BORHAN TEC
چهارشنبه 19 اسفند 1388, 18:55 عصر
براي اين كه بتوانيد درايو مربوط به حافظه فلش را Safe Remove كنيد ابتدا بايد تمام فايهاي باز را كه در آن درايو قرار دارد ببنديد. :متفکر:

__Genius__
چهارشنبه 19 اسفند 1388, 19:04 عصر
بله ، کاملاً مشخصه ، با کد اولی موفق به این کار نشدم ، اما کد دومی تمامی Drive های USB اعم از Flash و USB رو Remove میکنه ، هنوز تست نکردم برای Remove درایو فلش ، اگه شما تست کردین ممنون میشم کد رو اینجا قرار بدین .

BORHAN TEC
چهارشنبه 19 اسفند 1388, 19:41 عصر
اين برنامه اي كه در اينجا ضميمه كردين در صورتي كارش رو انجام ميده كه فايلي از داخل فلش باز نباشه. منظور فايل اجرايي نيست ، بلكه فايلهاي ديگر است، به عنوان مثال يك فايل متني با پسوند TXT. اگه بخواهيد كه برنامه كارش رو به درستي انجام بده اول بايد دنبال كدي باشيد كه فايل هاي باز شده از داخل حافظه فلش رو ببنده و سپس تابع مربوط به Remove كردن درايو مربوط رو فراخواني كنيد.

reza4361
دوشنبه 20 اردیبهشت 1389, 16:44 عصر
با تشکر از برنامه این برنامه یو اس پی رو ریموو میکنه ولی چطور میشه دوباره وصل شود برنامتون پرینتر رو هم ریموو میکنه اما میشه روش برگشت به حالت قبل رو هم بگید
لطفا یه نمونه بزارید:بوس:

vcldeveloper
دوشنبه 20 اردیبهشت 1389, 18:59 عصر
اما میشه روش برگشت به حالت قبل رو هم بگید
اون دستگاه دیگه ارتباطش با سیستم قطع میشه. روش برگروندنش این هست که سیم USB را از سیستم جدا کنید، و مجددا به پورت USB وصل کنید. راه حل برنامه نویسی نداره.

در ضمن، برای اینکه ببینید چطور میشه یک درایو USB خاص را Remove کرد، می تونید سورس PortableApps را از سایتش دانلود کنید. اون نرم افزار اوپن سورس هست، و با دلفی نوشته شده. برنامه روی فلش دیسک نصب میشه، و در داخل آن گزینه ایی برای Remove کردن دیسک فلش وجود داره. میتونید سورس مربوط به آن گزینه را ببینید، و ازش استفاده کنید.

حسین شهریاری
دوشنبه 20 اردیبهشت 1389, 20:42 عصر
سلام


می تونید سورس PortableApps را از سایتش دانلود کنید

ببخشید آقای کشاورز من جستجو کردم چیزی پیدا نکردم میشه آدرسشا برای بنده و سایرین لطف کنین و قرار بدین؟

vcldeveloper
دوشنبه 20 اردیبهشت 1389, 23:17 عصر
ببخشید آقای کشاورز من جستجو کردم چیزی پیدا نکردم میشه آدرسشا برای بنده و سایرین لطف کنین و قرار بدین؟
http://sourceforge.net/projects/portableapps/

reza4361
سه شنبه 21 اردیبهشت 1389, 11:20 صبح
میتونید درمورد پرینتر کمکم کنید ( اجازه پرینت یا عدم پرینت)

reza4361
دوشنبه 07 تیر 1389, 15:52 عصر
تو قسمت پرینتر & فکس ، پرینتر پاز شده میشه دوباره رزیومش کرد و بدون جدا کردن پورت یو اس پی پرینتر وصل میشه. چطور اینکارو تو برنامه انجام بدم ؟ یکی نیست مارو ورداره ؟!!

seyed_27
چهارشنبه 09 تیر 1389, 14:57 عصر
اینکه آقای کشاورز فرمودند که برای برگردوندن سیم را باید کشید و دوباره برگردوند:
یه برنامه ای با نامUSBSafelyRemove هست که بدون کندن سیم اون دستگاه را remove و بلعکس رو انجام میده
enable/disable

sara66
یک شنبه 27 تیر 1389, 09:57 صبح
این سورس همه را remove میکنه برای اینکه فقط درایو I را Remove کنه چی ؟

sara66
یک شنبه 27 تیر 1389, 10:08 صبح
http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_24811252.html
این تست کردم جواب نمیداد

sara66
پنج شنبه 31 تیر 1389, 17:47 عصر
نمیشه فلش ریموو بشه ؟

sara66
شنبه 09 مرداد 1389, 09:01 صبح
ببخشید اسپم میدم هنوز کسی نتونسته فقط فلش را ریموو کنه ؟