Bu uygulamada CLSID'ler ve ProgID'leri bulmak icin Component Object Model (COM) APIlerinin nasıl kullanıldığı gorucez. Aşağıdaki API'leri kullanıcaz.

CLSIDFromProgID : Verilen bir ProgID ile bir COM objenin CLSID'sini bulur.
StringFromCLSID : Bir CLSID'yi texte cevirmek icin.
CLSIDFromString : CLSID textini structure'a donuşturen fonksiyon.
ProgIDFromCLSID : Verilen bir CLSID'nin ProgID'sini bulur.


Kullanılan komutlar : Burada kullanılan VarPtr, VarPtrArray, VarPtrStringArray, StrPtr, ObjPtrgibi fonksiyonlar Visual Basic yardımları icinde yoktur ve gelecek yeni versiyonlarda olup olmayacakları Microsoft tarafından garanti edilmemiştir.

Adım adım poje
Once bir ActiveX DLL projesi başlatın. (Project1)
Projeyi compile edin. Şu anda elinizde Project1.dll isimli bir COM class'a sahip (Project1.Class1) dosya var.
Yeni bir standart EXE Projesi acın. Form1 kendiliğinden yaratılır.
Bu form uzerine 3 textbox, 1 buton ve 1 ListBox koyun.
Aşağıdaki kodu Formun kod kısmına kopyalayın.

Kod :

Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type

'API Tanımlamaları:
'=================

Private Declare Function CLSIDFromProgID _
Lib "ole32.dll" (ByVal lpszProgID As Long, _
pCLSID As GUID) As Long

Private Declare Function ProgIDFromCLSID _
Lib "ole32.dll" (pCLSID As GUID, lpszProgID As Long) As Long

Private Declare Function StringFromCLSID _
Lib "ole32.dll" (pCLSID As GUID, lpszProgID As Long) As Long

Private Declare Function CLSIDFromString _
Lib "ole32.dll" (ByVal lpszProgID As Long, _
pCLSID As GUID) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias _
"RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Sub Command1_Click()
Dim strProgID As String * 255
Dim pProgID As Long
Dim udtCLSID As GUID
Dim strCLSID As String * 255
Dim pCLSID As Long
Dim lngRet As Long
Dim strTemp As String
Dim i As Integer

'Bir ProgID al.
strTemp = Text1.Text

'CLSID'yi bul.
lngRet = CLSIDFromProgID(StrPtr(strTemp), udtCLSID)

'CLSID elemanlarını goster.
With List1
.AddItem Hex(udtCLSID.Data1)
.AddItem Hex(udtCLSID.Data2)
.AddItem Hex(udtCLSID.Data3)
For i = 0 To 7
.AddItem Hex(udtCLSID.Data4(i))
Next
End With

'CLSID'yi texte cevir ve pointer'ı geri dondur.
lngRet = StringFromCLSID(udtCLSID, pCLSID)

'CLSID'yi string olarak bul ve goruntule.
StringFromPointer pCLSID, strCLSID
Text2.Text = strCLSID

'CLSID'yi kontrol et.
With udtCLSID
.Data1 = 0
.Data2 = 0
.Data3 = 0
For i = 0 To 7
.Data4(i) = 0
Next
End With

'Texti tekrar CLSID'ye donuştur.
strTemp = Text2.Text
lngRet = CLSIDFromString(StrPtr(strTemp), udtCLSID)

'ProgID texti icin bir pointer bul. Bu bir Unicode texttir.
lngRet = ProgIDFromCLSID(udtCLSID, pProgID)

'ProgID'yi bul ve goster.
StringFromPointer pProgID, strProgID
Text3.Text = strProgID

End Sub

'Bu fonksiyon Unicode string'i gosteren bir pointerve bir string buffer alarak
'byte'ları VB'nin string buffer'ı icine atar.

Private Sub StringFromPointer(pOLESTR As Long, strOut As String)
Dim ByteArray(255) As Byte
Dim intTemp As Integer
Dim intCount As Integer
Dim i As Integer

intTemp = 1

'String'ler uzerinde gezerek her WORD'un ilk byte'ını bulur.
While intTemp 0
CopyMemory intTemp, ByVal pOLESTR + i, 2
ByteArray(intCount) = intTemp
intCount = intCount + 1
i = i + 2
Wend

'Byte dizinini bizim string'e kopyalar.
CopyMemory ByVal strOut, ByteArray(0), intCount
End Sub

Private Sub Form_Load()
Text1.Text = "Project1.Class1"
End Sub

Projeyi run edin ve butona tıklayın. Aşağıdakiler gorunecektir:

Text1 : CLSID'si istenen componen'tın ProgID'sini verir.
Text2 : CLSID'yi text formatında verir.
Test3 : CLSID'ye bağlı ProgID'yi verir.
List1 : CLSID'nin uyelerini structure olarak verir.
__________________