Seite 1 von 2
COM-Dll Funktionen
Verfasst: 07.09.2008 12:56
von Barratator
Hallo,
ich bin relativ neu in Purebasic (kann aber schon eine Menge andere Sprachen)

Ich suche jetzt seit fast 4 Stunden aber finde keine Antwort auf die Frage:
Ich möchte eine COM-DLL benutzen, schaffe es aber einfach nicht

Zu Testzwecken benutze ich die Skype4Com lib (
https://developer.skype.com/Docs/Skype4COMLib).
In der PB Hilfe gibt es ja dieses Beispiel, wo mit Interfaces und so gearbeitet wird (PureBasic.chm::/Reference/interfaces.html). Aber was soll ich jetzt anstelle von "MyCreateObject()" einsetzen, und wie rufe ich dann eine Funktion auf?
Danke im vorraus!
Gruß
Bastian
Verfasst: 07.09.2008 13:02
von edel
Verfasst: 07.09.2008 14:05
von Kiffi
@Barratator:
mit dem von edel erwähnten COMate kann man via PB relativ einfach
auf COM-Objekte zugreifen.
In Deinem Fall (Skype) würde ein einfacher Zugriff so aussehen:
Code: Alles auswählen
XIncludeFile "comate.pbi"
EnableExplicit
Define.COMateObject SkypeObject, SkypeFriend
Define.COMateEnumObject ENUMObject
Define FullName.s
SkypeObject = COMate_CreateObject("Skype4COM.Skype")
If SkypeObject
;Begin enumeration.
ENUMObject = SkypeObject\CreateEnumeration("Friends")
If ENUMObject
SkypeFriend = ENUMObject\GetNextObject()
While SkypeFriend
FullName = SkypeFriend\GetStringProperty("FullName")
Debug FullName
SkypeFriend\Release()
SkypeFriend = ENUMObject\GetNextObject()
Wend
ENUMObject\Release()
EndIf
SkypeObject\Release()
EndIf
Hinweis: Wenn Du den Code ausführst (und Skype läuft), so wird Skype
Dich fragen, ob die PB-Exe auf Skype zugreifen darf.
Falls Fragen sind: Hier bist Du richtig!
Grüße ... Kiffi
Verfasst: 07.09.2008 14:25
von Barratator
Super Danke !
@edel: Thx für die lib
@Kiffi: Thx fürs Beispiel
gruß
Bastian
Verfasst: 07.09.2008 14:36
von Barratator
Hallo,
also ich hab' jetzt mal folgendes versucht:
Code: Alles auswählen
XIncludeFile "comate.pbi"
;EnableExplicit
Define.COMateObject SkypeObject, SkypeFriend
Define.COMateEnumObject ENUMObject
Define FullName.s
SkypeObject = COMate_CreateObject("Skype4COM.Skype")
Procedure Friends()
If SkypeObject
ENUMObject = SkypeObject\CreateEnumeration("Friends")
If ENUMObject
SkypeFriend = ENUMObject\GetNextObject()
While SkypeFriend
FullName = SkypeFriend\GetStringProperty("FullName")
Debug FullName
SkypeFriend\Release()
SkypeFriend = ENUMObject\GetNextObject()
Wend
ENUMObject\Release()
EndIf
SkypeObject\Release()
EndIf
EndProcedure
D.h. Das ganze genommen und nur in eine Procedure gepackt.
Jetzt kommt aber immer der Fehler, dss SkypeObject keine Struktur hätte
Muss ich SkypeObject irgendwie Global difinieren, oder wie geht das???
Danke im Vorraus!
gruß
Bastian
EDIT: Und noch eine Frage: Wie bist du auf das "Friends" gekommen? in der Hilfe von der Skype4COM lib finde ich nirgends sowas

Verfasst: 07.09.2008 14:51
von edel
Barratator hat geschrieben:Muss ich SkypeObject irgendwie Global difinieren, oder wie geht das???
Richtig, oder du setzt das in die Procedure.
Verfasst: 07.09.2008 14:54
von Kiffi
Variablen, die per Define ausserhalb von Prozeduren deklariert wurden,
sind innerhalb von Prozeduren unbekannt.
aus diesem Grund sollte man die Deklaration in die Prozedur verlagern.
Dort nimmt man allerdings 'Protected' anstelle von 'Define'.
so geht's also besser:
Code: Alles auswählen
XIncludeFile "comate.pbi"
;EnableExplicit
Procedure Friends()
Protected SkypeObject.COMateObject, SkypeFriend.COMateObject
Protected ENUMObject.COMateEnumObject
Protected FullName.s
SkypeObject = COMate_CreateObject("Skype4COM.Skype")
If SkypeObject
ENUMObject = SkypeObject\CreateEnumeration("Friends")
If ENUMObject
SkypeFriend = ENUMObject\GetNextObject()
While SkypeFriend
FullName = SkypeFriend\GetStringProperty("FullName")
Debug FullName
SkypeFriend\Release()
SkypeFriend = ENUMObject\GetNextObject()
Wend
ENUMObject\Release()
EndIf
SkypeObject\Release()
EndIf
EndProcedure
hier noch ein Tipp: EnableExplicit solltest Du nicht auskommentieren,
sondern Dich gleich daran gewöhnen, Variablen, die Du verwendest, auch
direkt zu deklarieren. Das erspart Dir dann bei grösseren Codes die
unnötige Suche nach Bugs, die aufgrund von Tippfehlern passieren.
EDIT: Und noch eine Frage: Wie bist du auf das "Friends" gekommen? in der Hilfe von der Skype4COM lib finde ich nirgends sowas

ich habe das erste genommen, was mir einfach umzusetzen schien:
https://developer.skype.com/Docs/Skype4 ... Collection
Grüße ... Kiffi
Verfasst: 07.09.2008 16:38
von Barratator
Danke, das klappt jetzt soweit
Jetzt hab' ich aber ein anderes Problem:
Code: Alles auswählen
XIncludeFile "comate.pbi"
EnableExplicit
Global WMPObject.COMateObject
Global MediaObject.COMateObject
WMPObject = COMate_CreateObject("WMPlayer.OCX.7")
MediaObject = WMPObject\GetObjectProperty("currentMedia")
Debug MediaObject\GetStringProperty("name")
Bis zur vorletzten Zeile klappt alles Wunderbar

Allerdings gibts immer einen Fehler bei der letzten
Quelle: comate.pbi
Zeile: 1087
Inhalt: [ERROR] Invalid memory access. (read error at address 0)
Achja...das Script soll den aktuellen Titel aus dem Windows Media Player anzeigen.
Danke im vorraus
Gruß
Bastian
Verfasst: 07.09.2008 20:22
von Barratator
So...Wie es aussieht, kann ich keine Werte mehr aus einem Objekt mehr auslesen o.O
Ich weiß nicht wieso aber alles, dass so aussieht klappt bei mir nicht:
Code: Alles auswählen
XIncludeFile "comate.pbi"
EnableExplicit
Global WMPObject.COMateObject
Global MediaObject.COMateObject
WMPObject = COMate_CreateObject("WMPlayer.ocx")
Debug WMPObject
If WMPObject
MediaObject = WMPObject\GetObjectProperty("player")
Debug MediaObject
Debug MediaObject\GetRealProperty("playState")
EndIf
Aus dem WMPObject wird das "Player" Objekt gezogen, soweit klappt es. Aber egal was ich mache, aus diesem 2. Object kann ich keine Werte mehr entnehmen (Siehe vorletzte Zeile!).
Es kommt immer ein "Invalid Memory Access" fehler

Ich hab auch schon verschiedene Datentypen durchprobiert, aber es will einfach nicht funktionieren.
Was mache ich falsch?
Gruß
Bastian
Verfasst: 07.09.2008 20:38
von Kiffi
Barratator hat geschrieben:
das ist erst mal grundlegend falsch:
1. darfst Du nicht den Namen der Datei angeben. Da ist die Angabe in
Deinem vorletzten Posting schon richtiger: WMPlayer.OCX.7
2. werden OCXe immer mit COMate_CreateActiveXControl() angesprochen
und nicht mit COMate_CreateObject()
Vielleicht erklärst Du uns erst einmal, was Dein Code können soll.
Grüße ... Kiffi