OCX und das, mit dem Cocreate usw.

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Ok,
Habe ich durchgeschaut. Bis auch ein paar kleinigkeiten sieht es sehr gut aus.
- Bei über von Parameter Type Double war noch nicht auf VT_R8 umgeschrieben.
- Bei EnableCalibration ist das Password von Type BSTR (UNICODE). Übergebe nur Zeiger.

Wenn alles getestet ist kannst du mir ja bitte, zum abgleich von den "AdWrapper", bescheid geben .

Ich habe noch den "ATL Helper" mit der Funktion ReleaseInterface(*Obj) erweitert.
Somit braucht im Hauptprogramm kein Interface (IDispatch, IUnknown) mehr angegeben werden.

Hier Downloaden:
http://home.arcor.de/m_kastner/MyCodes

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

@MK-Soft
Hab hier mal ein Beispiel probiert, wo alle 8 Messkanäle abgefragt werden.
Funktioniert soweit super. Nun wollte ich aber die Farbe vom ContainerGadget
in PB4 ändern und irgendwie verstehe ich nicht, warum das nicht geht.

Messen funktioniert damit soweit super :allright:

Was leider störend im Windows ist, ist das Containercontroll, in dem ich nur
dort die Messwerte und Gadgets aufbauen kann. Oder geht das auch anders?
Ich meine damit, daß das Symbol unsichtbar ist und ich ein normales Fenster angezeigt bekomme? Wenn ich den ganzen ActiveX-Kram mal verstehen könnte,
hätte ich das schon erledigen können :cry:

Vielleicht kannst Du mir hier etwas weiter helfen.
Ich bin ja schon froh, das du der Einzigste Bist, der mir hier soweit
sehr geholfen hat. Im Vorraus vielen Dank hierzu und viele Grüsse
Falko

PS.: Herr Friedrich Lorenz , lorenz_gmbh@t-online.de [Firma Lorenz_GmbH] hat sich auch nach meiner letzten Mail nicht gemeldet, nachdem ich ihn drum gebeten hatte,
eine normale Standard DLL zu compilieren.

Mit der Herstellerfirma http://deutsch.ivt-hirschau.de/ , hatte ich mit einem netten Servicetechniker, Herrn Böhm Kontakt gehabt, der mir mitgeteilt hat, daß das Produckt: AD-USB4 eingestellt wurde, und das er ebenfalls meine Anfrage an Herrn Lorenz weitergeleitet hat.

Code: Alles auswählen

;-TOP  --  Grundgerüst von MK-Soft!
; Kommentar : Kleines Beispiel zur Anzeige 8 analoge  Eingänge (endlos)
; Datei     : Achtfach_Anzeige_analog.pb
; Version   : 1.0
; Erstellt  : 29.07.2006
; Geändert  : Falko Lünsmann

;- Includefiles
IncludeFile "Global.pb"
IncludeFile "AtlHelper.pb"
IncludeFile "AdWrapper.pb"

COMLIB_Init()

If InitAtl() = 0
  Debug LastMessage
  End
EndIf


If OpenWindow(0, 100, 100, 240, 235, "AD_USB 4 Version2XX",#PB_Window_SystemMenu )

  CreateGadgetList(WindowID(0)) 
    ContainerGadget(0, 0,0, 240, 235, #PB_Container_Raised ) ; This will be our container window, where the ActiveX will be rendered
    TextGadget(1, 30,  10, 70, 20, "Analog In0"):TextGadget(2, 140,  10, 80, 20, "0.0",#PB_Text_Border )
    TextGadget(3, 30,  35, 70, 20, "Analog In1"):TextGadget(4, 140,  35, 80, 20, "0.0",#PB_Text_Border )
    TextGadget(5, 30,  60, 70, 20, "Analog In2"):TextGadget(6, 140,  60, 80, 20, "0.0",#PB_Text_Border )
    TextGadget(7, 30,  85, 70, 20, "Analog In3"):TextGadget(8, 140,  85, 80, 20, "0.0",#PB_Text_Border )
    TextGadget(9, 30, 110, 70, 20, "Analog In4"):TextGadget(10, 140, 110, 80, 20, "0.0",#PB_Text_Border )
    TextGadget(11, 30, 140, 70, 20, "Analog In5"):TextGadget(12, 140, 140, 80, 20, "0.0",#PB_Text_Border )
    TextGadget(13, 30, 170, 70, 20, "Analog In6"):TextGadget(14, 140, 170, 80, 20, "0.0",#PB_Text_Border )
    TextGadget(15, 30, 200, 70, 20, "Analog In7"):TextGadget(16, 140, 200, 80, 20, "0.0",#PB_Text_Border )
    CloseGadgetList()

  *Container = CreateControl("ADUSB2XX.ADUSB2XXCtrl.1", GadgetID(0))
  If *Container = 0
    Debug LastMessage
    End
  EndIf
  
  *Control = GetControl(GadgetID(0))
  If *Control = 0
    Debug LastMessage
    ReleaseControl(*Container)
    End
  EndIf
  
  *ADUSB = QueryInterface(*Control, ?IID__DAD_USB2XX)
  If *ADUSB = 0
    Debug LastMessage
    ReleaseControl(*Container)
    End
  EndIf
        
  For i = 0 To 126
    If Scan(*ADUSB, i)
      Break
    EndIf
  Next i
    
  If i < 127
    IO=GetAnalogIO(*ADUSB, i, 1)
    ;Debug GetAnalogVoltage(*ADUSB, i, IO)
  Else
    MessageRequester("Fehler", "AD_USB2 nicht gefunden.")
  EndIf
     SetGadgetColor(1,#PB_Gadget_BackColor,RGB(0,128,254)) ; Geht leider nicht  
     
  Repeat
    Event = WindowEvent()
        Delay(0); gib der CPU etwas Luft :D
        SetGadgetText(2,StrD(GetAnalogVoltage(*ADUSB, 0, IO)))
        SetGadgetText(4,StrD(GetAnalogVoltage(*ADUSB, 1, IO)))
        SetGadgetText(6,StrD(GetAnalogVoltage(*ADUSB, 2, IO)))
        SetGadgetText(8,StrD(GetAnalogVoltage(*ADUSB, 3, IO)))
        SetGadgetText(10,StrD(GetAnalogVoltage(*ADUSB, 4, IO)))
        SetGadgetText(12,StrD(GetAnalogVoltage(*ADUSB, 5, IO)))
        SetGadgetText(14,StrD(GetAnalogVoltage(*ADUSB, 6, IO)))
        SetGadgetText(16,StrD(GetAnalogVoltage(*ADUSB, 7, IO))) 
       ;Debug GetAnalogVoltage(*ADUSB, i, IO) ; i entspricht der Kanalnummer

  Until Event = #PB_Event_CloseWindow
   Close(*ADUSB)        
  ReleaseInterface(*ADUSB)
  ReleaseControl(*Container)
             
  CloseWindow(0)   ; Don't forget this one, else the program will crash
EndIf   

End

;- DataSections AD_USB2XX
DataSection
  IID__DAD_USB2XX: ; BFD9E61F-75C4-4B33-8949-73A64F014514
  Data.l $BFD9E61F
  Data.w $75C4,$4B33
  Data.b $89,$49,$73,$A6,$4F,$01,$45,$14
  IID__DAD_USB2XXEvents: ; 9A894BB7-0F68-429D-A30A-FCE4F6379D78
  Data.l $BFD9E61F
  Data.w $75C4,$4B33
  Data.b $89,$49,$73,$A6,$4F,$01,$45,$14
EndDataSection
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Hi Falco,

versuch mal ohne Container, GetControl, QueryInterface mit

Code: Alles auswählen

*ADUSB = CreateObject("ADUSB2XX.ADUSB2XXCtrl.1")
FF :wink:

Download ComHelper: http://home.arcor.de/m_kastner/MyCodes/DCOM/

Ergebnis: Geht nicht ohne Container
Lösung: Container unsichtbar gestaltet
Zuletzt geändert von mk-soft am 29.07.2006 04:39, insgesamt 2-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

hab das mal mit Semikolon ausgeschlossen. Dann wird kurz das Fenster angezeigt und wieder ausgeblendet wo dann im Debugfenster nichst steht und im Editor (PB4) Invalid Memory Access gezeigt wird und der rote Balken über End steht.

Das hatte ich auch anders versucht, indem ich das ControlGadget ausblenden wollte. Ging auch nicht so.

Grüße Falko

[Edit] @MK-SOFT :allright:
Ich danke Dir hier noch einmal für deine super Unterstützung zum
AD_USB2XX.OCX. Hier noch einmal der Sourc, den wir unter ICQ zusammen-
gebaut haben. Ich habe mit den Farben das noch etwas anders
eingefügt und das unsichtbare ContainerGadget ans Ende gestellt.
Läuft perfekt!

Und so sieht das Ergebnis unter Purebasic aus:

1. Bild mit sichtbaren Container und das 2. unsichtbar und coloriert
Bild Bild


Code: Alles auswählen

;-TOP  --  Grundgerüst von MK-Soft!
; Kommentar : Kleines Beispiel zur Anzeige 8 analoge  Eingänge (endlos)
; Datei     : Achtfach_Anzeige_analog.pb
; Version   : 1.0
; Erstellt  : 29.07.2006
; Geändert  : Falko Lünsmann mit Hilfe von MK-Soft zu ActiveX-Controls

;- Includefiles
XIncludeFile "Global.pb"
XIncludeFile "AtlHelper.pb"
XIncludeFile "AdWrapper.pb"
; 
Global LastError.l
Global LastMessage.s
;
If OpenWindow(0, 100, 100, 245, 225, "AD_USB 4 Version2XX",#PB_Window_SystemMenu )
SetWindowColor(0, RGB(250,0,0))
  If CreateGadgetList(WindowID(0)) 
     TextGadget(1, 30,  10, 70, 20, "AnalogIn 0"):TextGadget(2, 140,  10, 80, 20, "0.0",#PB_Text_Border )
     TextGadget(3, 30,  35, 70, 20, "AnalogIn 1"):TextGadget(4, 140,  35, 80, 20, "0.0",#PB_Text_Border )
     TextGadget(5, 30,  60, 70, 20, "AnalogIn 2"):TextGadget(6, 140,  60, 80, 20, "0.0",#PB_Text_Border )
     TextGadget(7, 30,  85, 70, 20, "AnalogIn 3"):TextGadget(8, 140,  85, 80, 20, "0.0",#PB_Text_Border )
     TextGadget(9, 30, 110, 70, 20, "AnalogIn 4"):TextGadget(10, 140, 110, 80, 20, "0.0",#PB_Text_Border )
     TextGadget(11, 30, 135, 70, 20, "AnalogIn 5"):TextGadget(12, 140, 135, 80, 20, "0.0",#PB_Text_Border )
     TextGadget(13, 30, 160, 70, 20, "AnalogIn 6"):TextGadget(14, 140, 160, 80, 20, "0.0",#PB_Text_Border )
     TextGadget(15, 30, 185, 70, 20, "AnalogIn 7"):TextGadget(16, 140, 185, 80, 20, "0.0",#PB_Text_Border )
     For i= 1 To 15 Step 2
       SetGadgetColor(i,#PB_Gadget_BackColor,RGB(0,128,254)) 
     Next i
     ContainerGadget(0, 0,0, 0, 0, #PB_Container_Raised ) ; This will be our container window, where the ActiveX will be rendered
     CloseGadgetList()
  Else
   MessageRequester("Warnung","CreateGadgetList fehlgeschlagen!")
  EndIf 
;  
 COMLIB_Init()
  
   If InitAtl() = 0
     Debug LastMessage
     End
   EndIf

  *Container = CreateControl("ADUSB2XX.ADUSB2XXCtrl.1", GadgetID(0))
  If *Container = 0
    Debug LastMessage
    End
  EndIf
  
   *Control = GetControl(GadgetID(0))
  If *Control = 0
    Debug LastMessage
    ReleaseControl(*Container)
    End
  EndIf
  
   *ADUSB = QueryInterface(*Control, ?IID__DAD_USB2XX)
  
  If *ADUSB = 0
    Debug LastMessage
    ReleaseControl(*Container)
    End
  EndIf

   *ADUSB = QueryInterface(*Control, ?IID__DAD_USB2XX)
  If *ADUSB = 0
    Debug LastMessage
    ReleaseControl(*Container)
    End
  EndIf

       
  For i = 0 To 126
    If Scan(*ADUSB, i)
      Break 1
    EndIf
  Next i
    
  If i < 127
    IO=GetAnalogIO(*ADUSB, i, 1)
    ;Debug GetAnalogVoltage(*ADUSB, i, IO)
  Else
    MessageRequester("Fehler", "AD_USB2 nicht gefunden.")
  EndIf
    
  Repeat
    Event = WindowEvent()
        Delay(0); gib der CPU etwas Luft :D
        
        SetGadgetText(2,StrD(GetAnalogVoltage(*ADUSB, 0, IO)))
        SetGadgetText(4,StrD(GetAnalogVoltage(*ADUSB, 1, IO)))
        SetGadgetText(6,StrD(GetAnalogVoltage(*ADUSB, 2, IO)))
        SetGadgetText(8,StrD(GetAnalogVoltage(*ADUSB, 3, IO)))
        SetGadgetText(10,StrD(GetAnalogVoltage(*ADUSB, 4, IO)))
        SetGadgetText(12,StrD(GetAnalogVoltage(*ADUSB, 5, IO)))
        SetGadgetText(14,StrD(GetAnalogVoltage(*ADUSB, 6, IO)))
        SetGadgetText(16,StrD(GetAnalogVoltage(*ADUSB, 7, IO))) 
       ;Debug GetAnalogVoltage(*ADUSB, i, IO) ; i entspricht der Kanalnummer

  Until Event = #PB_Event_CloseWindow
   Close(*ADUSB)        
   ;ReleaseInterface(*ADUSB)
   ;ReleaseControl(*Container)
             
  CloseWindow(0)   ; Don't forget this one, else the program will crash
EndIf   

End

;- DataSections AD_USB2XX
DataSection
  IID__DAD_USB2XX: ; BFD9E61F-75C4-4B33-8949-73A64F014514
  Data.l $BFD9E61F
  Data.w $75C4,$4B33
  Data.b $89,$49,$73,$A6,$4F,$01,$45,$14
  IID__DAD_USB2XXEvents: ; 9A894BB7-0F68-429D-A30A-FCE4F6379D78
  Data.l $BFD9E61F
  Data.w $75C4,$4B33
  Data.b $89,$49,$73,$A6,$4F,$01,$45,$14
EndDataSection
[/edit]
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten