COM-Dll Funktionen

Anfängerfragen zum Programmieren mit PureBasic.
Barratator
Beiträge: 17
Registriert: 26.04.2008 09:48

COM-Dll Funktionen

Beitrag 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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Barratator
Beiträge: 17
Registriert: 26.04.2008 09:48

Beitrag von Barratator »

Super Danke !

@edel: Thx für die lib ;)

@Kiffi: Thx fürs Beispiel :)


gruß
Bastian
Barratator
Beiträge: 17
Registriert: 26.04.2008 09:48

Beitrag 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 :roll:
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 :(
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Barratator hat geschrieben:Muss ich SkypeObject irgendwie Global difinieren, oder wie geht das???
Richtig, oder du setzt das in die Procedure.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Barratator
Beiträge: 17
Registriert: 26.04.2008 09:48

Beitrag 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
Barratator
Beiträge: 17
Registriert: 26.04.2008 09:48

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Barratator hat geschrieben:

Code: Alles auswählen

WMPObject = COMate_CreateObject("WMPlayer.ocx")
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
a²+b²=mc²
Antworten