Seite 1 von 1

CLSID oder IID importieren statt suchen :wink:

Verfasst: 03.08.2007 21:11
von ts-soft
Naja, geht nicht mit allen, aber sehr viele sind schon in der Lib. Hier der
Beispielcode, der ersichtlich macht, was ich meine, jedenfalls denjenigen,
die schon mit COM was gemacht haben.

Code: Alles auswählen

Import "uuid.lib"
  CLSID_TaskbarList
  IID_ITaskbarList
EndImport

Procedure HideFromTaskBar(hWnd.l, Flag.l)
  Protected TBL.ITaskbarList

  CoInitialize_(0)
  If CoCreateInstance_(@CLSID_TaskBarList, 0, 1, @IID_ITaskBarList, @TBL) = #S_OK
    TBL\HrInit()
    If Flag
      TBL\DeleteTab(hWnd)
    Else
      TBL\AddTab(hWnd)
    EndIf
    TBL\Release()
  EndIf
  CoUninitialize_()

EndProcedure

; DataSection
;   CLSID_TaskBarList:
;   Data.l $56FDF344
;   Data.w $FD6D, $11D0
;   Data.b $95, $8A, $00, $60, $97, $C9, $A0, $90
;   IID_ITaskBarList:
;   Data.l $56FDF342
;   Data.w $FD6D, $11D0
;   Data.b $95, $8A, $00, $60, $97, $C9, $A0, $90
; EndDataSection

If OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "test")
  HideFromTaskBar(WindowID(0), #True)
  While WaitWindowEvent() <> 16 : Wend  
EndIf

Verfasst: 04.08.2007 02:36
von PureLust
Hi Thomas,

au mann ... bei Deine Codes komm ich mir häufig soooo dumm und unwissend vor. :cry:
Könntest Du für Anfänger oder auch geistig scheinbar unbewaffnete Leute wie mich vielleicht noch kurz dazu schreiben was CLSID oder IID überhaupt ist und wofür man Deinen Code einsetzen könne? :oops:

ThanX und Gruß,
PureLust.

Verfasst: 04.08.2007 04:16
von edel

Verfasst: 04.08.2007 05:06
von PureLust
Ich nehme mal an das war jetzt für mich oder andere Unwissende bestimmt.
Forensuche hat geschrieben:Die Suche hat 55 Ergebnisse ergeben.
Meintest Du nun einen bestimmten davon?
Denn für jemanden wie mich der keinen Schimmer hat worum es gehen könnte sehen die alle nach böhmischen Dörfern aus. :roll:

Verfasst: 04.08.2007 06:10
von MVXA
Von OOP, ActiveX und dem ganzen Schmarn hast du sicher schon gehört.
Windows bietet Programmen ein Interface um diese Objekte mit anderen
Programmen zu teilen. Bestes Beispiel hierfür ist das Browsergadget.

Um aber an dieses Objekt wie das Browsergadget zu kommen, muss man
wissen wie es heißt. Ein einfacher Name geht nicht, da die Gefahr
einer Kollision mit einem anderen Objekt zu groß ist. Deswegen
bemüht man sich sog. CLSID. Bei CLSIDs ist die Gefahr einer Kollision
sehr gering. Der Preis für diese Sicherheit ist relativ hoch. Die
CLSIDs belegen mehr Speicher als in einer Long-Variable gefasst werden
kann.

Um diese CLSIDs dennoch in PureBasic nutzen zu können, behelfen sich
viele der Möglichkeit Datenstränge mit dem Schlüsselwort Data in die
Binarys mit einzubinden. Allerdings muss man selbst erstmal den Wert
der CLSID ermitteln und das ist gar nicht mal so einfach. TS-Soft hat
aber entdeckt, dass die CLSIDs sich auch in den *.lib Dateien befinden,
die man ja seit (nicht mehr so) neusten mit PureBasic im Linkprozess
mit einbinden kann und ist so nett und teilt sein Wissen mit einem
kleinen Beispiel mit uns.

Wenn ich mich in einem Punkt irren sollte, bitte nicht schlagen, wollt nur helfen :)

Verfasst: 04.08.2007 13:44
von PureLust
@MVXA:

Ahhhh .... nun ist es einiges klarer.
Das war echt mal eine gute und leicht verständliche Erklärung.
(Wenn wir jetzt bei ICQ wäre würd' ich Dir ne ganz bestimmter tZer rüberschicken. :mrgreen: )

Also vielen Dank für die Mühe und die gute Beschreibung und natürlich auch Dank an Thomas für den (dank MVXA nun auch für mich verständlichen ;) und) nützlichen Code. :allright:

Verfasst: 04.08.2007 15:11
von ts-soft
>> und) nützlichen Code. :allright:
Es geht hierbei weniger um den Code, als um die Tatsache, das
sich sehr viele dieser CLISD, IID, GUID usw. (ein paar tausend)
aus der UUID.lib importieren lassen, so das man deren Wert nicht
suchen oder in Datas tippen muß.

Zumindest die meisten, unmittelbar ans OS gebundenen Classen
sind enthalten: Shell, Browser, HTML usw. (vor allem auch Treiberclassen)
CLISD zu AgentControl, MediaPlayer usw. findet man dort aber nicht.

Verfasst: 04.08.2007 15:19
von PureLust
ts-soft hat geschrieben:Es geht hierbei weniger um den Code, ...
Beim schreiben des Posts war ich bereits mit mir am hadern, ob ich nun "Code" oder "Tip" schreiben sollte.
"Tip" hätte den Kern vermutlich eher getroffen, hatte mich dann aber doch für "Code" entschieden, weil Du ja auch noch ein Anwendungsbeispiel beigepackt hattest.

Auf jeden Fall vielen Dank dafür - sobald ich mal tiefer in diese Gefilde vorstoße, werde ich dass mit Sicherheit gut gebrauchen können. :allright:

Verfasst: 04.08.2007 17:32
von ts-soft
Nochmal zur Verdeutlichung:
Es werden Variablen vom Typ CLSID bzw. IID importiert. Diese Strukturen
sind in PB vordefiniert.

Folgenden Code mal testen und mit auskommentierter DataSection im ersten
Code vergleichen:

Code: Alles auswählen

Import "uuid.lib"
  CLSID_TaskbarList
  IID_ITaskbarList
EndImport

Define *myCLSID.CLSID
*myCLSID = @CLSID_TaskbarList

Define *myIID.IID
*myIID = @IID_ITaskbarList

Define lpsz.s{76}
Define i.l

Debug "CLSID_TaskbarList"
Debug "----------------"
Debug "Data: "
Debug "$" + Hex(*myCLSID\Data1)
Debug "$" + Hex(*myCLSID\Data2 & $FFFF)
Debug "$" + Hex(*myCLSID\Data3 & $FFFF)

For i = 0 To 7
  Debug "$" + Hex(*myCLSID\Data4[i] & $FF)
Next
Debug ""
Debug "String: " + PeekS(@lpsz, StringFromGUID2_(*myCLSID, @lpsz, 76), #PB_Unicode)

Debug ""
Debug "IID_ITaskbarList"
Debug "----------------"
Debug "Data: "
Debug "$" + Hex(*myIID\Data1)
Debug "$" + Hex(*myIID\Data2 & $FFFF)
Debug "$" + Hex(*myIID\Data3 & $FFFF)

For i = 0 To 7
  Debug "$" + Hex(*myIID\Data4[i] & $FF)
Next
Debug ""
Debug "String: " + PeekS(@lpsz, StringFromGUID2_(*myIID, @lpsz, 76), #PB_Unicode)
Debug ""