Что нового

Расширение стандартной AutoIt библиотеки WinAPI.au3

Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: По поводу вопроса №2: В какую дир-ию надо положить файл au3.userudfs.properties?

akoulev сказал(а):
А точно ли, что именно туда? Дело в том, что в C:\Program Files\AutoIt3\SciTE нет подкаталога "Properties"; зато в C:\Program Files\AutoIt3\SciTE лежит файл au3.keywords.properties - не рядышком ли с ним и должен лежать au3.userudfs.properties?

У тебя установлен неполноценный (тот, что поставляется вместе с AutoIt) SciTE, в нем au3.user.calltips.api и au3.userudfs.properties бесполезны, работать не будут все равно. Скачай полноценную версию SciTE здесь.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Yashied [?]
Не думаю, что многие разделят твою точку зрения, в противном случае я бы давно сделал инсталятор.
Согласен.
Kaster сказал(а):
OffTopic:
а я вот не вижу ничего крамольного в инсталляторе. главное знать что он делает ;D
Тоже согласен. НО! Пусть инсталлятор мне покажет всю информацию о том, куда и что он ставит, и какие ключи в реестре он пишет! Пусть даже это будет install.log. К сожалению, многие инсталляторы этого не делают! И ещё немало важно лично для меня, то, что многие программисты используя инсталлятор, не заботятся о деинсталляции (качественной) своих программ. А посему (по возможности) я лично предпочитаю использовать программы, не требующие инсталляции!
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Долго разбирался как работать с ресурсами. Вот получились "функции" для удобства работы.
Я всё правильно сделал ?

Код:
#Include <GUIConstantsEx.au3>
#Include <Memory.au3>
#Include <WinAPIEx.au3>
#Include <Array.au3>

Global $aResFileDelete[1]
OnAutoItExitRegister("_Exit")

$hInstance = _WinAPI_LoadLibrary(@ScriptDir & '\test.exe')

$Jpg = _LoadResource("JPEG", "LOGO_1", @TempDir & '\' & "1.jpg", $hInstance)
$Txt = _LoadResource("INFO", "COPYRIGHT", @TempDir & '\' & "1.txt", $hInstance)
$Wave = _LoadSound("SOUND", "MESSAGE", $hInstance)


$hForm = GUICreate('MyGUI', 350, 350)
GUICtrlCreatePic($Jpg, 0, 0, 350, 350)
GUICtrlSetState(-1, $GUI_DISABLE)
$Button = GUICtrlCreateButton('Play Sound', 125, 316, 100, 23)
GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $Button
            _WinAPI_PlaySound($Wave, BitOR($SND_ASYNC, $SND_MEMORY, $SND_NOWAIT))
    EndSwitch
WEnd

Func _Exit()
	_WinAPI_FreeLibrary($hInstance)

	If Not IsDeclared("aResFileDelete") Then
		Local $aResFileDelete[1]
		Exit
	EndIf

	For $i = 1 To UBound($aResFileDelete) - 1
		FileDelete($aResFileDelete[$i])
	Next

EndFunc

Func _LoadSound($sDirRes, $sSubDirRes, $iIDLoadLibrary = 0)

	; Load SOUND resource
	$hResource = _WinAPI_FindResource($iIDLoadLibrary, $sSubDirRes, $sDirRes)
	$Size = _WinAPI_SizeofResource($iIDLoadLibrary, $hResource)
	$hData = _WinAPI_LoadResource($iIDLoadLibrary, $hResource)
	$pData = _WinAPI_LockResource($hData)

	; Copy WAV to memory for use later
	$hWave = _MemGlobalAlloc($Size, 2)
	$pWave = _MemGlobalLock($hWave)
	_MemMoveMemory($pData, $pWave, $Size)
	;_MemGlobalUnlock($hWave)

	Return $pWave

EndFunc

Func _LoadResource($sDirRes, $sSubDirRes, $sNameSaveFile = 0, $iIDLoadLibrary = 0)

	If Not IsDeclared("aResFileDelete") Then
		Local $aResFileDelete[1]
		If SetError(1, 0, 1) Then Return 0
	EndIf

	_ArrayAdd($aResFileDelete, $sNameSaveFile)

	; Load resource
	$hResource = _WinAPI_FindResource($iIDLoadLibrary, $sSubDirRes, $sDirRes)
	$Size = _WinAPI_SizeofResource($iIDLoadLibrary, $hResource)
	$hData = _WinAPI_LoadResource($iIDLoadLibrary, $hResource)
	$pData = _WinAPI_LockResource($hData)
	; Save resource to *.* file
	$hFile = FileOpen($sNameSaveFile, 2 + 16)
	$tData = DllStructCreate('byte[' & $Size & ']', $pData)
	FileWrite($hFile, DllStructGetData($tData, 1))
	FileClose($hFile)

	Return $sNameSaveFile

EndFunc
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
FlatX007 сказал(а):
Долго разбирался как работать с ресурсами. Вот получились "функции" для удобства работы.
Я всё правильно сделал?

Ну, в архиве есть пример на эту тему. А лучшим доказательством того, правильно ли ты все сделал или нет, является результат (надеюсь положительный) работы твоего кода.

;)
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Ну это сделано на базе примера из справки ... просто так удобнее ;)
 

Luke

Знающий
Сообщения
64
Репутация
14
1 Спасибо за отличную UDF.
2 Просьба добавить функцию SetDIBitsToDevice()

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Добавил сам, вроде работает
Код:
; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_SetDIBitsToDevice
; Description ...: Sets the pixels in the specified rectangle on the device that is associated with the destination device context using color data from a DIB, JPEG, or PNG image
; Syntax.........: _WinAPI_SetDIBitsToDevice($hDC, $iXDest, $iYDest, $iWidth, $iHeight, $iXSrc, $iYSrc, $iStartScan, $iScanLines, $pBits, $pBMI[, $iColorUse = 0])
; Parameters ....: $hDC         - Handle to a device context
;                   $iXDest		- The x-coordinate, in logical units, of the upper-left corner of the destination rectangle
;					$iYDest		- The y-coordinate, in logical units, of the upper-left corner of the destination rectangle
;					iWidth		- The width, in logical units, of the image
;					iHeight		- The height, in logical units, of the image.
;					$iXSrc		- The x-coordinate, in logical units, of the lower-left corner of the image.
;					$iYSrc		- The y-coordinate, in logical units, of the lower-left corner of the image
;                  $iStartScan  - Specifies the starting scan line for the device-independent color data in the array pointed  to
;                  +by the pBits parameter.
;                  $iScanLines  - Specifies the number of scan lines found in the array containing device-independent color data
;                  $pBits       - Pointer to the DIB color data, stored as an array of bytes.  The format of  the  bitmap  values
;                  +depends on the biBitCount member of the $tagBITMAPINFO structure pointed to by the pBMI parameter.
;                  $pBMI        - Pointer to a $tagBITMAPINFO structure that contains information about the DIB
;                  $iColorUse   - Specifies whether the iColors member of the $tagBITMAPINFO structure was provided  and,  if  so,
;                  +whether iColors contains explicit red, green, blue (RGB) values or palette indexes.  The iColorUse  parameter
;                  +must be one of the following values:
;                  |0 - The color table is provided and contains literal RGB values
;                  |1 - The color table consists of an array of 16-bit indexes into the logical palette of hDC
; Return values .: Success      - True
;                  Failure      - False
; Author ........: Luke
; Modified.......:
; Remarks .......:
; Related .......: $tagBITMAPINFO
; Link ..........: @@MsdnLink@@ SetDIBitsToDevice
; Example .......:
; ===============================================================================================================================
Func _WinAPI_SetDIBitsToDevice($hDC, $iXDest, $iYDest, $iWidth, $iHeight, $iXSrc, $iYSrc, $iStartScan, $iScanLines, $pBits, $pBMI, $iColorUse = 0)
	Local $aResult = DllCall("gdi32.dll", "int", "SetDIBitsToDevice", "handle", $hDC, "int", $iXDest, "int", $iYDest, _
			"dword", $iWidth, "dword", $iHeight, "int", $iXSrc, "int", $iYSrc, "uint", $iStartScan, "uint", $iScanLines, _
			"ptr", $pBits, "ptr", $pBMI, "uint", $iColorUse = 0)
	If @error Then Return SetError(@error, @extended, False)
	Return $aResult[0]
EndFunc   ;==>_WinAPI_SetDIBitsToDevice
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Luke, приведи законченный пример для этой функции и я ее добавлю в следующей версии.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Обновил библиотеку до версии 2.7.

Список изменений:
  • Удалены следующие функции.

    _WinAPI_DuplicateIcon
    _WinAPI_FreeHandle
    _WinAPI_FreeIcon
    _WinAPI_FreeObject
    _WinAPI_PrivateExtractIcon

    Используйте вместо них следующие функции, соответственно.

    _WinAPI_CopyIcon
    _WinAPI_CloseHandle
    _WinAPI_DestroyIcon
    _WinAPI_DeleteObject
    _WinAPI_ShellExtractIcon

  • Переименованы следующие функции.

    _WinAPI_DuplicateBitmap => _WinAPI_CopyBitmap
    _WinAPI_DuplicateCursor => _WinAPI_CopyCursor
    _WinAPI_DuplicateStruct => _WinAPI_CopyStruct
    _WinAPI_FitToBitmap => _WinAPI_ResizeBitmap
    _WinAPI_FreeCursor => _WinAPI_DestroyCursor
    _WinAPI_SetLibraryColorMode => _WinAPI_SetUDFColorMode
    _WinAPI_ShellExtractIcons => _WinAPI_ShellExtractIcon

  • Следующие функции заменены на их Unicode версии.

    _WinAPI_GetObjectEx
    _WinAPI_GetTextMetrics

  • Добавлены следующие функции.

    _WinAPI_BeginDeferWindowPos
    _WinAPI_CalculatePopupWindowPosition
    _WinAPI_CloseEnhMetaFile
    _WinAPI_CopyEnhMetaFile
    _WinAPI_CreateEnhMetaFile
    _WinAPI_DeferWindowPos
    _WinAPI_DeleteEnhMetaFile
    _WinAPI_EndDeferWindowPos
    _WinAPI_GetEnhMetaFile
    _WinAPI_GetEnhMetaFileBits
    _WinAPI_GetEnhMetaFileDescription
    _WinAPI_GetEnhMetaFileDimension
    _WinAPI_GetEnhMetaFileHeader
    _WinAPI_GetFileVersionInfo
    _WinAPI_GetModuleFileName
    _WinAPI_GetModuleHandleEx
    _WinAPI_GetProcessCommandLine
    _WinAPI_GetUDFColorMode
    _WinAPI_GetUDFVersion
    _WinAPI_SetEnhMetaFileBits
    _WinAPI_SwapDWord
    _WinAPI_PlayEnhMetaFile
    _WinAPI_VerQueryRoot
    _WinAPI_VerQueryValue

  • Добавлены примеры к вышеперечисленным функциям.
  • Обновлена документация.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Небольшие исправления без изменения версии.

Список изменений:
  • Следующие функции теперь работают с KLID вместо LCID.

    _WinAPI_GetKeyboardLayout
    _WinAPI_GetKeyboardLayoutList
    _WinAPI_LoadKeyboardLayout
    _WinAPI_SetKeyboardLayout

  • Добавлены дополнительные параметры для функции _WinAPI_SetKeyboardLayout().
  • Обновлена документация.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Обновил библиотеку до версии 2.8.

Список изменений:
  • Переименованы следующие функции.

    _WinAPI_GetClassLong => _WinAPI_GetClassLongEx
    _WinAPI_SetClassLong => _WinAPI_SetClassLongEx

  • Добавлены следующие функции.

    _WinAPI_DeleteFile
    _WinAPI_ExtFloodFill
    _WinAPI_GetWindowLongEx
    _WinAPI_MoveToEx
    _WinAPI_OffsetPoints
    _WinAPI_PolyBezier
    _WinAPI_PolyBezierTo
    _WinAPI_PolyDraw
    _WinAPI_RegCopyTreeEx
    _WinAPI_RegDeleteKeyValue
    _WinAPI_RegDeleteTreeEx
    _WinAPI_RegDeleteValue
    _WinAPI_RegDuplicateHKey
    _WinAPI_RegLoadMUIString
    _WinAPI_ReOpenFile
    _WinAPI_RotatePoints
    _WinAPI_SetWindowLongEx
    _WinAPI_Wow64EnableWow64FsRedirection

  • Добавлены примеры к вышеперечисленным функциям.
  • Обновлена документация.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Обновил библиотеку до версии 2.9.

Список изменений:
  • Добавлены следующие функции.

    _WinAPI_CoInitialize
    _WinAPI_CoUninitialize
    _WinAPI_GetErrorMode
    _WinAPI_GetFileAttributes
    _WinAPI_IOCTL
    _WinAPI_SetErrorMode
    _WinAPI_SetFileAttributes
    _WinAPI_SetLocaleInfo
    _WinAPI_ShellGetSetFolderCustomSettings
    _WinAPI_ShellOpenFolderAndSelectItems
    _WinAPI_ShellQueryUserNotificationState

  • Добавлены примеры к вышеперечисленным функциям.
  • Обновлена документация.



Добавлено:
Сообщение автоматически объединено:

Кстати, обратите внимание на функцию _WinAPI_ShellOpenFolderAndSelectItems(), многим может пригодиться, тем более, когда-то уже на нашем форуме возникали вопросы на эту тему. Пример в архиве.

:smile:
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
А можно в списке функций делать пояснение в краце на русском, для чего нужна та или иная функция , без хорошего знания английского очень трудно искать, с переводчиком тоже не айс очень долго.

Я понимаю что это никогда не делалось для этого нужно время, но всё же было бы очень удобно.

Например:

_WinAPI_AboutDlg - отобразить About диалог.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я планировал в ближайшем будущем сделать русскую справку для этого UDF, но вот насколько оно будет ближайшее... Вообщем, посмотрим.

PS

_WinAPI_ShellOpenFolderAndSelectItems() - открывает указанную папку в проводнике и выделяет указанный файл(ы).

:smile:


Добавлено:
Сообщение автоматически объединено:

А вообще, при использовании WinAPI, в большинстве случаев все равно придется лезть в MSDN, а там все на английском. Русские версии MSDN содержат далеко не все или с автоматическим переводом, что еще хуже.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Знаю что это будет трудоёмкой задачей, но было бы неплохо если бы в справке функций разделялись по категориям (процессы, окна, диалоги, и т.д.).
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR сказал(а):
Знаю что это будет трудоёмкой задачей, но было бы неплохо если бы в справке функций разделялись по категориям (процессы, окна, диалоги, и т.д.).

Я все еще надеюсь, что WinAPIEx.au3 будет включен в состав AutoIt, так что пока делать этого наверное не буду.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я тут недавно наткнулся на INF-8090i v7 специфиакацию для ATAPI CD-ROM устройств. Очень увлекательное чтиво, должен сказать. :D Я даже написал, опираясь на эту документацию, функцию _WinAPI_GetCDType(), которую в ближайшее время включу в библиотеку.

Код:
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

Global $Text, $Type, $Drive = DriveGetDrive('CDROM')

If IsArray($Drive) Then
	For $i = 1 To $Drive[0]
		$Text = 'Unknown'
		$Type = _WinAPI_GetCDType($Drive[$i])
		If Not @error Then
			Switch $Type
				Case 0x0000
					$Text = 'No media'
				Case 0x0008
					$Text = 'CD-ROM'
				Case 0x0009
					$Text = 'CD-R'
				Case 0x000A
					$Text = 'CD-RW'
				Case 0x0010
					$Text = 'DVD-ROM'
				Case 0x0011
					$Text = 'DVD-R SR'
				Case 0x0012
					$Text = 'DVD-RAM'
				Case 0x0013
					$Text = 'DVD-RW RO'
				Case 0x0014
					$Text = 'DVD-RW SR'
				Case 0x0015
					$Text = 'DVD-R DL'
				Case 0x0016
					$Text = 'DVD-R DL JR'
				Case 0x0017
					$Text = 'DVD-RW DL'
				Case 0x0018
					$Text = 'DVD-DDR'
				Case 0x001A
					$Text = 'DVD+RW'
				Case 0x001B
					$Text = 'DVD+R'
				Case 0x0040
					$Text = 'BD-ROM'
				Case 0x0041
					$Text = 'BD-R SRM'
				Case 0x0042
					$Text = 'BD-R RRM'
				Case 0x0043
					$Text = 'BD-RE'
				Case 0x0050
					$Text = 'HD DVD-ROM'
				Case 0x0051
					$Text = 'HD DVD-R'
				Case 0x0052
					$Text = 'HD DVD-RAM'
				Case 0x0053
					$Text = 'HD DVD-RW'
				Case 0x0058
					$Text = 'HD DVD-R DL'
				Case 0x005A
					$Text = 'HD DVD-RW DL'
			EndSwitch
		EndIf
		ConsoleWrite(StringUpper($Drive[$i]) & ' => ' & $Text & @CR)
	Next
EndIf

; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_GetCDType
; Description....: Retrieves a type of the media which is loaded into a specified CD-ROM device.
; Syntax.........: _WinAPI_GetCDType ( $sDrive )
; Parameters.....: $sDrive - The drive letter of the CD tray to retrieve information, in the format D:, E:, etc.
; Return values..: Success - The type of the media, it must be one of the following values.
;
;                            0x0000 - No media
;                            0x0008 - CD-ROM
;                            0x0009 - CD-R
;                            0x000A - CD-RW
;                            0x0010 - DVD-ROM
;                            0x0011 - DVD-R Sequential Recording
;                            0x0012 - DVD-RAM
;                            0x0013 - DVD-RW Restricted Overwrite
;                            0x0014 - DVD-RW Sequential Recording
;                            0x0015 - DVD-R Dual Layer
;                            0x0016 - DVD-R Dual Layer Jump Recording
;                            0x0017 - DVD-RW Dual Layer
;                            0x0018 - DVD-Download Disc Recording
;                            0x001A - DVD+RW
;                            0x001B - DVD+R
;                            0x0040 - BD-ROM
;                            0x0041 - BD-R Sequential Recording Mode (SRM)
;                            0x0042 - BD-R Random Recording Mode (RRM)
;                            0x0043 - BD-RE
;                            0x0050 - HD DVD-ROM
;                            0x0051 - HD DVD-R
;                            0x0052 - HD DVD-RAM
;                            0x0053 - HD DVD-RW
;                            0x0058 - HD DVD-R Dual Layer
;                            0x005A - HD DVD-RW Dual Layer
;                            0xFFFF - Unknown
;
;                  Failure - 0 and sets the @error flag to non-zero.
; Author.........: Yashied
; Modified.......:
; Remarks........: None
; Related........:
; Link...........: @@MsdnLink@@ IOCTL_SCSI_PASS_THROUGH
; Example........: Yes
; ===============================================================================================================================

Func _WinAPI_GetCDType($sDrive)

	Local $hFile = _WinAPI_CreateFileEx('\\.\' & $sDrive, 3, 0xC0000000, 0x03)

	If Not $hFile Then
		Return SetError(1, 0, 0)
	EndIf

	Local $tSPT = DllStructCreate('ushort Length;byte ScsiStatus;byte PathId;byte TargetId;byte Lun;byte CdbLength;byte SenseInfoLength;byte DataIn;byte Alignment[3];ulong DataTransferLength;ulong TimeOutValue;ulong_ptr DataBufferOffset;ulong SenseInfoOffset;byte Cdb[16];byte Hdr[8]')
	Local $tCDB = DllStructCreate('byte;byte;byte[2];byte[3];byte[2];byte;byte[2];byte[4]', DllStructGetPtr($tSPT, 'Cdb'))
	Local $tHDR = DllStructCreate('byte[4];byte;byte;byte[2]', DllStructGetPtr($tSPT, 'Hdr'))
	Local $Size = DllStructGetSize($tSPT) - 8

	DllStructSetData($tSPT, 'Length', $Size)
	DllStructSetData($tSPT, 'ScsiStatus', 0)
	DllStructSetData($tSPT, 'PathId', 0)
	DllStructSetData($tSPT, 'TargetId', 0)
	DllStructSetData($tSPT, 'Lun', 0)
	DllStructSetData($tSPT, 'CdbLength', 12)
	DllStructSetData($tSPT, 'SenseInfoLength', 0)
	DllStructSetData($tSPT, 'DataIn', 1)
	DllStructSetData($tSPT, 'DataTransferLength', 8)
	DllStructSetData($tSPT, 'TimeOutValue', 30)
	DllStructSetData($tSPT, 'DataBufferOffset', $Size)
	DllStructSetData($tSPT, 'SenseInfoOffset', 0)

	DllStructSetData($tCDB, 1, 0x46)
	DllStructSetData($tCDB, 2, 0)
	DllStructSetData($tCDB, 3, 0, 1)
	DllStructSetData($tCDB, 3, 0, 2)
	DllStructSetData($tCDB, 5, 0, 1)
	DllStructSetData($tCDB, 5, 8, 2)
	DllStructSetData($tCDB, 6, 0)
	DllStructSetData($tCDB, 7, 0, 1)
	DllStructSetData($tCDB, 7, 0, 2)

	Local $Ret = DllCall('kernel32.dll', 'int', 'DeviceIoControl', 'ptr', $hFile, 'dword', $IOCTL_SCSI_PASS_THROUGH, 'ptr', DllStructGetPtr($tSPT), 'dword', $Size, 'ptr', DllStructGetPtr($tSPT), 'dword', DllStructGetSize($tSPT), 'dword*', 0, 'ptr', 0)

	If (@error) Or (Not $Ret[0]) Then
		$Ret = 0
	EndIf
	_WinAPI_CloseHandle($hFile)
	If Not IsArray($Ret) Then
		Return SetError(2, 0, 0)
	EndIf
	Return BitOR(BitShift(DllStructGetData($tHDR, 4, 1), -8), DllStructGetData($tHDR, 4, 2))
EndFunc   ;==>_WinAPI_GetCDType
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
madmasles сказал(а):
У меня (на Windows XP) ругается...

Скачай еще раз WinAPIEx.au3, я там добавил некоторые константы, и не опубликовал эту информацию (поздно уже было).

:whistle:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied
Спасибо, скачал.
У меня на ноутбуке дисководы: физический DVD/CD-RW и виртуальный DVD.
Для обоих функция выдает => No media.
Завтра проверю на других компьютерах и отпишусь.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
madmasles сказал(а):
У меня на ноутбуке дисководы: физический DVD/CD-RW и виртуальный DVD.
Для обоих функция выдает => No media.

Хе-Хе. Надо было мне сразу написать пояснение. Функция выдает не тип железки (такового не существует, поскольку привод поддерживает множество разных форматов), а тип диска, который в него в данный момент вставлен. Если нет диска, то соответственно "No media". Кстати, очень полезно для определения наличия диска в приводе.
 
Верх