function EjectMedia(DriveLetter: string): boolean;
var
  hr: THandle;
  buffer: Cardinal;
begin
  hr := CreateFile(PChar('\\.\' + DriveLetter + ':'), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
  if hr <> INVALID_HANDLE_VALUE then
    if DeviceIOControl(hr, IOCTL_STORAGE_EJECT_MEDIA, nil, 0, nil, 0, buffer, nil) then
      result := true
    else
      result := false;
  CloseHandle(hr);
end;procedure TForm1.Image34Click(Sender: TObject);
begin
EjectMedia(Change_U);//要如何在这里调用呢?这样好像不对本人新菜多指教,Change_U是当前盘符
end;

解决方案 »

  1.   

    没有任何效果那也不是该如何调用的问题,你要检查函数本身的问题,或者检查有没有为Image34指定click事件
      

  2.   


      const     
          IOCTL_STORAGE_EJECT_MEDIA   =   $2D4808;     
          IOCTL_STORAGE_LOAD_MEDIA   =   $2D480C;     
        
      function   LoadMedia(DriveLetter:   String):   Boolean;     
      var     
          hr:THandle;     
          buffer:   Cardinal;     
      begin     
          hr   :=   CreateFile(PChar('\\.\'+DriveLetter+':'),   GENERIC_READ,FILE_SHARE_READ   or   FILE_SHARE_WRITE,   NIL,   OPEN_EXISTING,   0,   0);     
          if   hr   <>   INVALID_HANDLE_VALUE   then     
              if   DeviceIOControl(hr,   IOCTL_STORAGE_LOAD_MEDIA,   NIL,   0,   NIL,   0,   buffer,   NIL)   then     
                  result   :=   true     
                else     
                  result   :=   false;     
              CloseHandle(hr);     
      end;     
        
      //F&auml;hrt   die   Schublade   aus     
      function   EjectMedia(DriveLetter:   String):   Boolean;     
      var     
          hr:THandle;     
          buffer:   Cardinal;     
      begin     
          hr   :=   CreateFile(PChar('\\.\'+DriveLetter+':'),   GENERIC_READ,FILE_SHARE_READ   or   FILE_SHARE_WRITE,   NIL,   OPEN_EXISTING,   0,   0);     
          if   hr   <>   INVALID_HANDLE_VALUE   then     
              if   DeviceIOControl(hr,   IOCTL_STORAGE_EJECT_MEDIA,   NIL,   0,   NIL,   0,   buffer,   NIL)   then     
                  result   :=   true     
                else     
                  result   :=   false;     
              CloseHandle(hr);     
      end;
    论坛老资料上的,据说这个函数可以删除和复位USB设备
    要如何用一个按钮实现删除某个盘符的USB设备呢?
      

  3.   

    --转载大富翁的.   
      DeviceIoControl(hDevice:THandle;   dwIoControlCode:DWORD;   lpInBuffer:Byte;   nInBufferSize:DWORD;     
                                  lpOutBuffer:Byte;   nOutBufferSize:DWORD;   lpBytesReturned:DWORD;   lpOverlapped:PChar;)   
        
      hDevice   是从CreateFile返回的VxD句柄。   
      dwIoControlCode   是用来制定VxD将要进行的操作。   
      lpInBuffer   是包含了VxD完成dwIoControlCode所制定操作的数据的缓冲区地址。   
                            如果这个操作不需要数据,可以传为NIL。   
      nInBufferSize   是由lpInBuffer所指向的缓冲区的地址的大小(byte)。   
      lpOutBuffer   是VxD程序在操作成功之后要将输出数据输出到的缓冲区。   
                            如果这个操作没有任何返回值,这个值为NIL。   
      nOutBufferSize   是lpOutBuffer所指向的缓冲区的大小(byte)。   
      lpBytesReturned   是一个dword型变量的地址。这个变量用来接收VxD在lpOutBuffer中写入数据的大小。   
      lpOverlapped   是一个指针。如果你要一直等到操作完成,这个值应该赋为NIL。   
        
      例如:   
      var   
            A   :   THandle;   
            B   :   Byte;   
            C   :   DWORD;   
      DeviceIOControl   (A,   VWIN32_DIOC_DOS_INT13,   @B,   SizeOf   (B),   @B,   SizeOf   (B),   C,   nil)   ;
      

  4.   

    Change_U 里是什么? 有没有带冒号?
      

  5.   

    CreateFile(PChar('\\.\'+DriveLetter+':')  那就不成了两个冒号了??
      

  6.   

    你在Image34Click这个事件里没有对EjectMedia这个函数的返回值进行处理,当然就没反应啦procedure TForm1.Image34Click(Sender: TObject);
    begin
      if EjectMedia(Change_U) then//要如何在这里调用呢?这样好像不对本人新菜多指教,Change_U是当前盘符
           ShowMessage('执行成功')
      else
          ShowMessage('执行不成功')
    end;
      

  7.   

    把CreateFile(PChar('\\.\' + DriveLetter + ':'), GENERIC_READ, FIL.....这句改成CreateFile(PChar('\\.\' + DriveLetter), GENERIC_READ, FIL.....
      

  8.   

    不行喔,不能删除':' 因为func里转成PCHAR调用时改成这样吧EjectMedia(Change_U[1]);
      

  9.   


      const     
          IOCTL_STORAGE_EJECT_MEDIA   =   $2D4808;     
          IOCTL_STORAGE_LOAD_MEDIA   =   $2D480C;  
    这个常量放在程序代码最开始的  const下就可以了对吧?
      

  10.   

    楼主CreateFile是对的,估计是DeviceIoControl里面的问题
      

  11.   

    EjectMedia(Change_U[1]);  直接这样调用就行了
      

  12.   


    调用好像没有问题
    好像是这里的问题执行到if hr <> INVALID_HANDLE_VALUE then的时候,
    hr 和 INVALID_HANDLE_VALUE是相等的
      

  13.   

    呵呵~ 这我就不知道,反正我测试过可以删除和复位USB设备, 只是在我的电脑里的盘符还在.打开提示插入
      

  14.   

    我的在XP中可以运行没问题,你的不会是在vista下运行吧, 如果是的话, 再试试CreateFile(PChar('\\\\.\\' + DriveLetter + ':'), GENERIC.... 吧