type
PDEV_BROADCAST_HDR = ^ _DEV_BROADCAST_HDR;
_DEV_BROADCAST_HDR = record
dbch_size, dbch_devicetype, dbch_reserved:DWORD;
end;
const
DBT_DEVICEARRIVAL= $8000;
DBT_DEVTYP_VOLUME = 2;
procedure TForm1.Proc1(var Msg: TMessage);//обработчик сообщения WM_DEVICECHANGE
begin
if Msg.WParam=DBT_DEVICEARRIVAL then
if PDEV_BROADCAST_HDR(Msg.LParam)^.dbch_devicetype= DBT_DEVTYP_VOLUME then
ShowMessage('флешку воткнули!');
end;
Как определить,что вставлен новый носитель данных?
Собственно,вопрос в заголовке:)
Царапины? Потертости?
Цитата: andriano
Прежде всего надо определиться с набором свойств, которые позволяют отличать новый накопитель от старого.
Царапины? Потертости?
Царапины? Потертости?
:)
Возможно, через Removable Storage Manager?
Может,и через RSM...даже не знаю
В последнем случае надо обрабатывать сообщение WM_DeviceChange.
Итак,конкретизирую:в USB-разъём была вставлена флэшка.После того,как закончится процесс её установки(если драйвера на неё ещё не были установлены) или подключения(в общем случае),мне надо скопировать с неё что-то
Программы,определяющие,что вставлена новая флэшка:WinAmp,WMP
Надеюсь,теперь понятно.Если вдруг появятся какие-то вопросы,неясности–задавайте,уточняйте.Чем смогу,тем помогу:)
надо обрабатывать сообщение WM_DEVICECHANGE.
0)процесс распадается на потоки,а Олька многопоточные почему-то отлаживать не умеет(или не умею я:))
1)ошибок вроде не возникает,хотя программа сама не завершается(она у меня консольная,так что приходится по Ctrl+C)
2)всё-таки она не работает:(,а в журнале событий появляется сообщение о том,что "описание для ошибки с кодом 98(или 111,как повезёт) не найдено…"
Ну и как это понять и как сделать?Может,кто пример подкинет(только чисто на API,без всяких там…)?
вот пример на FASM
Код:
format PE GUI 4.0
entry start
include 'win32w.inc'
section '.data' data readable writeable
_class TCHAR 'FASMWIN32',0
_title TCHAR 'Win32 program template',0
_error TCHAR 'Startup failed.',0
_msg TCHAR 'device inserted',0
wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class
msg MSG
DBT_DEVICEARRIVAL equ $8000
section '.code' code readable executable
start:
invoke GetModuleHandle,0
mov [wc.hInstance],eax
invoke LoadIcon,0,IDI_APPLICATION
mov [wc.hIcon],eax
invoke LoadCursor,0,IDC_ARROW
mov [wc.hCursor],eax
invoke RegisterClass,wc
test eax,eax
jz error
invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,192,NULL,NULL,[wc.hInstance],NULL
test eax,eax
jz error
msg_loop:
invoke GetMessage,msg,NULL,0,0
cmp eax,1
jb end_loop
jne msg_loop
invoke TranslateMessage,msg
invoke DispatchMessage,msg
jmp msg_loop
error:
invoke MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK
end_loop:
invoke ExitProcess,[msg.wParam]
proc WindowProc hwnd,wmsg,wparam,lparam
push ebx esi edi
cmp [wmsg],WM_DESTROY
je .wmdestroy
cmp [wmsg], WM_DEVICECHANGE
je .WMDEVICECHANGE
.defwndproc:
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp .finish
.WMDEVICECHANGE: ;;; обработка сообщения
cmp [wparam], DBT_DEVICEARRIVAL
jnz .finish
mov eax, [lparam]
add eax, 4
cmp dword [eax], 2
jnz .finish
invoke MessageBox, 0,_msg,_msg,0
jmp .finish
.wmdestroy:
invoke PostQuitMessage,0
xor eax,eax
.finish:
pop edi esi ebx
ret
endp
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'
entry start
include 'win32w.inc'
section '.data' data readable writeable
_class TCHAR 'FASMWIN32',0
_title TCHAR 'Win32 program template',0
_error TCHAR 'Startup failed.',0
_msg TCHAR 'device inserted',0
wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class
msg MSG
DBT_DEVICEARRIVAL equ $8000
section '.code' code readable executable
start:
invoke GetModuleHandle,0
mov [wc.hInstance],eax
invoke LoadIcon,0,IDI_APPLICATION
mov [wc.hIcon],eax
invoke LoadCursor,0,IDC_ARROW
mov [wc.hCursor],eax
invoke RegisterClass,wc
test eax,eax
jz error
invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,192,NULL,NULL,[wc.hInstance],NULL
test eax,eax
jz error
msg_loop:
invoke GetMessage,msg,NULL,0,0
cmp eax,1
jb end_loop
jne msg_loop
invoke TranslateMessage,msg
invoke DispatchMessage,msg
jmp msg_loop
error:
invoke MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK
end_loop:
invoke ExitProcess,[msg.wParam]
proc WindowProc hwnd,wmsg,wparam,lparam
push ebx esi edi
cmp [wmsg],WM_DESTROY
je .wmdestroy
cmp [wmsg], WM_DEVICECHANGE
je .WMDEVICECHANGE
.defwndproc:
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp .finish
.WMDEVICECHANGE: ;;; обработка сообщения
cmp [wparam], DBT_DEVICEARRIVAL
jnz .finish
mov eax, [lparam]
add eax, 4
cmp dword [eax], 2
jnz .finish
invoke MessageBox, 0,_msg,_msg,0
jmp .finish
.wmdestroy:
invoke PostQuitMessage,0
xor eax,eax
.finish:
pop edi esi ebx
ret
endp
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'