Fragen zum Importieren von Dlls

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
memdee
Beiträge: 134
Registriert: 09.09.2004 18:49
Computerausstattung: Win 7 x64
Wohnort: Wiesbaden
Kontaktdaten:

Fragen zum Importieren von Dlls

Beitrag von memdee »

Moin,

ich hab schon versucht, mich ein bisschen in die Thematik einzulesen, aber das Ganze ist mir wohl etwas zu hoch.

Ich versuche, Funktionen aus der "InkObj.dll" (bei der XP Tablet Edition mit dabei) in PB aufzurufen, genauer: ein InkPicture-Objekt zu verwenden. Spaßeshalber hab ich's mal in VB 6 probiert und hatte dort keine Probleme, scheint wohl ne ActiveX-Lib zu sein.

Folgende Schritte hab ich bisher unternommen:
Mittels des OLE/COM-Interface Generators die Interfaces generiert
(zur Info: http://memdee.progamerz.com/temp/inkobj.pbi )
Dann hab ich folgenden Code (um-)geschrieben:


Code: Alles auswählen

XIncludeFile "comate.pbi" 


Define.COMateObject InkPicture

hwnd = OpenWindow(0, #PB_Ignore, #PB_Ignore, 800, 600, "InkPicture-Test", #PB_Window_SystemMenu | #PB_Window_Invisible) 
  
InkPicture = COMate_CreateObject("{E85662E0-379A-40D7-9B5C-757D233F9923}",hwnd)


If InkPicture = 0 
  
  MessageRequester("Error", COMate_GetLastErrorDescription()) 
  
  End 
  
EndIf 


While WindowEvent() : Delay(1) : Wend 

HideWindow(0, #False) 

Repeat 
  
  WWE = WaitWindowEvent() 
  
Until WWE = #PB_Event_CloseWindow 

InkPicture\Release()
{E85662E0-379A-40D7-9B5C-757D233F9923} ist die ID von "IID_IInkPicture", oder zumindest dachte ich das. (zu finden in der Interface-Datei unter GUIDs).

Leider spuckt das Programm den Fehler "invalid ProgID" aus.

Wahrscheinlich merkt man, dass ich noch nicht so durch die Materie durchsteige. Wo ist mein Denkfehler? Müsste es nicht so in der Art funktionieren?

Danke für eure Antworten und sorry für meine Blödheit :roll:
meep?
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Fragen zum Importieren von Dlls

Beitrag von Kiffi »

memdee hat geschrieben:Mittels des OLE/COM-Interface Generators die Interfaces generiert
brauchst Du nicht, wenn Du COMate verwendest. Also weg damit. :-)
memdee hat geschrieben:Leider spuckt das Programm den Fehler "invalid ProgID" aus.
probier mal:

Code: Alles auswählen

InkPicture = COMate_CreateObject("MSInkAut.InkOverlay")
Ich sehe grade: Du willst auch noch ein hwnd übergeben. Ist das eine
Komponente, die Du in einem Fenster anzeigen lassen willst?

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

1. COMate_CreateActiveXControl()
2. Das Ding hat wohl keine ProgramID, also richtige GUID angeben.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
memdee
Beiträge: 134
Registriert: 09.09.2004 18:49
Computerausstattung: Win 7 x64
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von memdee »

Kiffi:
Wow, so funktionierts, danke! :)
Woher nimmst du bloß immer die GUIDs? :D
Jawoll, ist eine Komponente, die ich in einem Fenster anzeigen lassen will, aber mit Übergabe von hWnd ists kein Problem. Danke nochmal :)

ts-soft:
Funktioniert sowohl mit CreateObject() als auch mit CreateActiveXControl(), aber das ActiveXControl ist natürlich etwas komfortabler in der Anwendung.
Vielen Dank!
meep?
Benutzeravatar
memdee
Beiträge: 134
Registriert: 09.09.2004 18:49
Computerausstattung: Win 7 x64
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von memdee »

Noch eine Frage:
Warum funktioniert das hier nicht?

Code: Alles auswählen

InkPicture = COMate_CreateActiveXControl(10,10,700,600,"MSInkAut.InkPicture")
InkPicture\SetProperty("Picture = 'D:\PureBasic\inked\inkpicture\image.bmp'")
In VB heißts tatsächlich "Picture", aber auch mit "src" o.ä. scheints nicht zu klappen. Hingegen z.B. "Enabled = #False" funktioniert.

Was mach ich falsch?

Schöne Grüße
meep?
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

memdee hat geschrieben:In VB heißts tatsächlich "Picture"
zeig mal den VB-Code.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
memdee
Beiträge: 134
Registriert: 09.09.2004 18:49
Computerausstattung: Win 7 x64
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von memdee »

Ah, ich seh grad den Fehler; das anzugebende Picture darf kein BMP o.ä. sein, sondern muss ein extra IPictureDisp-Objekt sein :roll:
http://msdn.microsoft.com/en-us/library ... S.85).aspx

Nur; wie krieg ich das in PB hin?

(ich seh nämlich gerade, dass das in VB auch nicht so intuitiv geht wie gedacht...)
meep?
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

memdee hat geschrieben:Nur; wie krieg ich das in PB hin?
Kiffi hat geschrieben:zeig mal den VB-Code.
a²+b²=mc²
Benutzeravatar
memdee
Beiträge: 134
Registriert: 09.09.2004 18:49
Computerausstattung: Win 7 x64
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von memdee »

Wie gesagt, mein VB-Code funktioniert auch nicht, und ein Beispiel hab ich bisher vergeblich gesucht; ich hab das Picture-Property über das Property-Menü rechts im Bild zugewiesen, das funktioniert.
Will ich's per Code machen, gibts nen Type mismatch:
http://memdee.progamerz.com/temp/vb_inkpicture.JPG

edit: Ein Beispiel für FoxPro hab ich gefunden:
http://www.tablet-pc-online.eu/Programm ... FP/VFP.htm (ganz unten ist InkPicture zu finden)
meep?
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

memdee hat geschrieben:Will ich's per Code machen, gibts nen Type mismatch:
in VB geht es so:

Code: Alles auswählen

Dim myPic As IPictureDisp
Set myPic = LoadPicture("lalelu.bmp")
Set InkPicture.Picture = myPic
jetzt müsste man nur noch rausfinden, wie man ein IPictureDisp-Objekt
mit PB erzeugt...

Grüße ... Kiffi

// Edit

vielleicht ein wenig verwegen, aber probier mal folgendes aus:

Code: Alles auswählen

Define ScriptControl.COMateObject
Define VBS.s

ScriptControl = COMate_CreateObject("ScriptControl")

ScriptControl\SetProperty("Language = 'VBScript'")

VBS = "Dim myPic" + #CRLF$
VBS + "Set myPic = LoadPicture(" + Chr(34) + "lalelu.bmp" + Chr(34) + ")"

ScriptControl\Invoke("AddCode('" + VBS + "')")

Define myPic.COMateObject

myPic = ScriptControl\GetObjectProperty("Eval('myPic')")

If myPic
  
  ; hier Übergabe von myPic an Dein Ink-Dingens
  
  myPic\Release()
  
EndIf

ScriptControl\Release()
a²+b²=mc²
Antworten