Seite 1 von 2

Fragen zum Importieren von Dlls

Verfasst: 04.03.2009 13:20
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:

Re: Fragen zum Importieren von Dlls

Verfasst: 04.03.2009 13:27
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

Verfasst: 04.03.2009 13:27
von ts-soft
1. COMate_CreateActiveXControl()
2. Das Ding hat wohl keine ProgramID, also richtige GUID angeben.

Verfasst: 04.03.2009 13:38
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!

Verfasst: 06.03.2009 13:34
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

Verfasst: 06.03.2009 13:49
von Kiffi
memdee hat geschrieben:In VB heißts tatsächlich "Picture"
zeig mal den VB-Code.

Grüße ... Kiffi

Verfasst: 06.03.2009 14:05
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...)

Verfasst: 06.03.2009 14:08
von Kiffi
memdee hat geschrieben:Nur; wie krieg ich das in PB hin?
Kiffi hat geschrieben:zeig mal den VB-Code.

Verfasst: 06.03.2009 14:13
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)

Verfasst: 06.03.2009 14:48
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()