Skip to content

Instantly share code, notes, and snippets.

@kumatti1
Last active August 29, 2015 14:23
Show Gist options
  • Save kumatti1/4621e82645f28dd3eee4 to your computer and use it in GitHub Desktop.
Save kumatti1/4621e82645f28dd3eee4 to your computer and use it in GitHub Desktop.
途中まで
Option Explicit
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Declare PtrSafe _
Function IIDFromString Lib "ole32.dll" ( _
ByVal lpsz As LongPtr, _
ByRef lpiid As GUID _
) As Long
Private Declare PtrSafe _
Function DispCallFunc Lib "OleAut32.dll" ( _
ByVal pvInstance As LongPtr, _
ByVal oVft As LongPtr, _
ByVal cc_ As Long, _
ByVal vtReturn As Integer, _
ByVal cActuals As Long, _
ByRef prgvt As Integer, _
ByRef prgpvarg As LongPtr, _
ByRef pvargResult As Variant _
) As Long
Const CC_STDCALL = 4&
Private Declare PtrSafe _
Function CoGetObject Lib "Ole32" ( _
ByVal pszName As LongPtr, _
ByVal pBindOptions As LongPtr, _
ByRef riid As GUID, _
ByRef ppv As Any) As Long
Private Declare PtrSafe _
Function CoCreateInstance Lib "Ole32" ( _
ByRef rclsid As GUID, _
ByVal pUnkOuter As LongPtr, _
ByVal dwClsContext As Long, _
ByRef riid As GUID, _
ByRef ppv As Any) As Long
Sub hoge()
Dim hr&
Dim IMMDeviceEnumerator As IUnknown
Const str_IID_IMMDeviceEnumerator = "{A95664D2-9614-4F35-A746-DE8DB63617E6}"
Dim IID_IMMDeviceEnumerator As GUID
hr = IIDFromString(StrPtr(str_IID_IMMDeviceEnumerator), IID_IMMDeviceEnumerator)
Debug.Print Hex$(hr)
'CLSID_MMDeviceEnumerator
hr = CoGetObject(StrPtr("new:BCDE0395-E52F-467C-8E3D-C4579291692E"), 0, IID_IMMDeviceEnumerator, IMMDeviceEnumerator)
Debug.Print Hex$(hr)
Dim IMMDevice As IUnknown
Dim Vnt(0 To 2) As Variant
Vnt(0) = 0&
Vnt(1) = 0&
Vnt(2) = VarPtr(IMMDevice)
Dim pArgs(0 To 2) As LongPtr
Dim i As Long
Dim vt(0 To 2) As Integer
For i = 0 To 2
pArgs(i) = VarPtr(Vnt(i))
vt(i) = VarType(Vnt(i))
Next
Dim VTBLIndex As Long
VTBLIndex = 4
#If Win64 Then
VTBLIndex = VTBLIndex * 8
#Else
VTBLIndex = VTBLIndex * 4
#End If
Dim vntResult As Variant
hr = DispCallFunc(ObjPtr(IMMDeviceEnumerator), VTBLIndex, _
CC_STDCALL, vbLong, _
3, vt(0), pArgs(0), vntResult)
Debug.Print Hex$(hr), Hex$(vntResult)
Debug.Print IMMDevice Is Nothing
End Sub
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment