OCX und das, mit dem Cocreate usw.

Anfängerfragen zum Programmieren mit PureBasic.
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 hat geschrieben:Sehe ich auch so.
Solange das Dispinterface nicht öffentlich ist kann man mal andere Programmierer fragen wie das Interface aufgebaut ist.
Hiermit kann man aus der OCX eine Helpfile erstellen, welche auch VC++ Objecte korrekt anzeigen soll. Ob das weiterhelfen könnte?

http://www.freeware-download.com/downlo ... s/976.html

Habs mal ausprobiert. Nur ich kann mit den objekt.verknüpfungen so erstmal nichst anfangen. Vielleicht aber du?

MfG Falko
Zuletzt geändert von Falko am 25.02.2006 13:56, insgesamt 1-mal geändert.
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 »

Habe es Versucht im Container laufen zu lassen und komme zum gleichen ergebis. Sorry

Code: Alles auswählen


Interface AD_USB2XX Extends IDispatch
  Scan(DeviceNr); boolean (Long)
  AnalogVoltage(DeviceNr, Channel); Double
  AnalogVoltage2(DeviceNr.w, Channel.w, rhs.double); Void
  DigIO(DeviceNr.w); short
  DigIO2(DeviceNr.w, rhs.w); void
  GetAnalogDiffVoltage(DeviceNr.w,Channel.w); Double
  GetDeviceType(DeviceNr.w); short
  GetError(DeviceNr.w); short
  GetSerialNr(DeviceNr.w); short
  AnalogIO(DeviceNr.w, Channel.w); long
  AnalogIO2(DeviceNr.w, Channel.w, rhs.l); void
  EnableCalibration(*Password); BSTR Unicode ; 
  Calibration(DeviceNr.w, IO.w, Level.w, Channel.w); long
  Calibration2(DeviceNr.w, IO.w, Level.w, Channel.w, rhs.l); void
  SerialNr(DeviceNr.w); short
  SerialNr2(DeviceNr.w, rhs.w); void
  ReadAnalogVoltage(DeviceNr.w, Channel.w); double
  WriteAnalogVoltage(DeviceNr.w, Channel.w, Voltage.double); void
  ReadDigIn(DeviceNr.w); short
  WriteDigOut(DeviceNr.w, Value.w); void
  DataIO(DeviceNr.w); void
  Close(); void
EndInterface

Procedure.s Uni2Ansi(unicodestr.l) ; Converts Unicode to normal (Ansi) string
  lenA = WideCharToMultiByte_(#CP_ACP, 0, unicodestr, -1, 0, 0, 0, 0);
  ansistr.s = Space(lenA)
  If (lenA > 0)
    WideCharToMultiByte_(#CP_ACP, 0, unicodestr, -1, @ansistr, lenA, 0, 0);
  EndIf
  ProcedureReturn ansistr
EndProcedure

Procedure.l Ansi2Uni(ansistr.s) ; Converts normal (Ansi) string to Unicode
  lenA.l = Len(ansistr)
  lenW = MultiByteToWideChar_(#CP_ACP, 0, ansistr, lenA, 0, 0)
  If (lenW > 0) ; Check whether conversion was successful
    unicodestr = SysAllocStringLen_(0, lenW)
    MultiByteToWideChar_(#CP_ACP, 0, ansistr, lenA, unicodestr, lenW)
    result = unicodestr
    ProcedureReturn result
  Else
    ProcedureReturn 0
  EndIf
EndProcedure


If OpenLibrary(0, "ATL.dll") ; Use the ATL DLL for our container
  CoInitialize_(0)

  If OpenWindow(0, 100, 100, 300, 315, #PB_Window_SystemMenu, "ATL test")

    CreateGadgetList(WindowID()) 
      ContainerGadget(0, 10, 10, 280, 270) ; This will be our container window, where the ActiveX will be rendered
      CloseGadgetList()
     
      ButtonGadget(1, 10, 285, 70, 25, "Stop")
      ButtonGadget(2, 90, 285, 70, 25, "Play")
     
    If CallFunction(0,"AtlAxWinInit")
     
      CallFunction(0, "AtlAxCreateControl", Ansi2Uni("ADUSB2XX.ADUSB2XXCtrl.1"), GadgetID(0), 0, @Container.IUnknown) ; It always create the IE control even if flash isn't found
      If Container
        CallFunction(0,"AtlAxGetControl", GadgetID(0), @oObject.AD_USB2XX)
        If oObject
          If oObject\QueryInterface(?IID__DAD_USB2XX, @oObject.AD_USB2XX) = 0 ; Be sure it's a flash object in the IE container
            
            r1 = oObject\Scan(0)
            Debug r1
            
            Repeat
              Event = WaitWindowEvent()
             
              If Event = #PB_Event_Gadget
             
                Select EventGadgetID()
                  Case 1

                   
                  Case 2
                EndSelect
              EndIf
             
            Until Event = #PB_Event_CloseWindow
           
            oObject\Release()
          EndIf
          oObject\Release()
        EndIf
      EndIf
    EndIf
       
    CloseWindow(0)   ; Don't forget this one, else the program will crash
  EndIf   

  CoUninitialize_()
EndIf 
 
End

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

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

@Falco:
Gib mir mal bitte Mail Adresse von Friedrich Lorenz.
Werde mal ne höfliche anfrage stellen.
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 »

PN ist abgeschickt.

Der obige Source zeigt mir zwar das AD-USB-Icon im Container an, aber macht beim Scan-Befehl mit IMA dann Schluss.
Also nichts anderes wie bei der ComLib, außer das ich dort noch ein Icon zu sehen bekomme.
Ansonstens der gleiche Fehler. Ich hoffe, das du von Friedrich Lorenz eine passende Lösung erhältst.
Ich leider habe vergebends versucht ihn darum zu bitten, ob er seine Lib nicht zu einer StandardDLL ohne ActiveX compilieren könnte.
Vielleicht ist er jetzt sauer, was ich nicht damit erreichen wollte.
Ich bin ja auch nicht sauer, das ich so viel Geld für das Modul ausgegeben habe und es so nicht benutzen kann :lol:

MfG Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Hmm... disassemblieren ist wohl nicht erlaubt, nichtmal für private zwecke?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
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 »

DarkDragon hat geschrieben:Hmm... disassemblieren ist wohl nicht erlaubt, nichtmal für private zwecke?
Soweit ich weis, ist jedes diassemblieren von fremden Programmen verboten, die man nicht selbst programmiert hat :mrgreen:

Vielleicht gibt es ja eine Ausnahme, wenn man sie nur zum eigenen Gebrauch anpassen will. Aber eine Änderung mittels diassembler und neuprogrammierung ist, glaube ich, auch verboten.

Wäre eigendlich logisch. Höchstens, wenn man den Programmierer auf einen Fehler aufmerksam machen will, und ihm diese Änderung zuschickt, die er dann weiter verbreiten kann, währe es eine Ausnahme.
Aber da würde ich vorerst den Programmierer dieser OCX erst anschreiben.

MfG Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
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 , schon eine Antwort bekommen? Ich glaube er wird nicht antworten

MfG Falko
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 »

@Falko,
Dir bekannte antwort erhalten.
Das Problem sehe ich jetzt das die Funktion Scan() einen Rückgabe von Type Variant hat. Eine Rückgabe von einer Strukturetype ist nicht direkt möglich und lösen damit einen Invalid Memory Access aus.
Arbeite gerade an der IDispatch Funktion Invoke(). Übergabe der Parameter in einer Structure (DISPARMS) und Rückgabe in Type Variant. Bin noch am Basteln.
Das Control läuft im ALT-Container und die Funktionen z.B. Close() lösen keine Fehler aus.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

@Falko,
Habe dir was zum testen geschrieben. Nur für PB4

Code: Alles auswählen


;- Konstanten

#DISPATCH_METHOD = $1
#DISPATCH_PROPERTYGET = $2
#DISPATCH_PROPERTYPUT = $4
#DISPATCH_PROPERTYPUTREF = $8

Enumeration   ; VARENUM
  #VT_EMPTY = 0
  #VT_NULL = 1
  #VT_I2 = 2
  #VT_I4 = 3
  #VT_R4 = 4
  #VT_R8 = 5
  #VT_CY = 6
  #VT_DATE = 7
  #VT_BSTR = 8
  #VT_DISPATCH = 9
  #VT_ERROR = 10
  #VT_BOOL = 11
  #VT_VARIANT = 12
  #VT_UNKNOWN = 13
  #VT_DECIMAL = 14
  #VT_I1 = 16
  #VT_UI1 = 17
  #VT_UI2 = 18
  #VT_UI4 = 19
  #VT_I8 = 20
  #VT_UI8 = 21
  #VT_INT = 22
  #VT_UINT = 23
  #VT_VOID = 24
  #VT_HRESULT = 25
  #VT_PTR = 26
  #VT_SAFEARRAY = 27
  #VT_CARRAY = 28
  #VT_USERDEFINED = 29
  #VT_LPSTR = 30
  #VT_LPWSTR = 31
  #VT_RECORD = 36
  #VT_INT_PTR = 37
  #VT_UINT_PTR = 38
  #VT_FILETIME = 64
  #VT_BLOB = 65
  #VT_STREAM = 66
  #VT_STORAGE = 67
  #VT_STREAMED_OBJECT = 68
  #VT_STORED_OBJECT = 69
  #VT_BLOB_OBJECT = 70
  #VT_CF = 71
  #VT_CLSID = 72
  #VT_VERSIONED_STREAM = 73
  #VT_BSTR_BLOB = $fff
  #VT_VECTOR = $1000
  #VT_ARRAY = $2000
  #VT_BYREF = $4000
  #VT_RESERVED = $8000
  #VT_ILLEGAL = $ffff
  #VT_ILLEGALMASKED = $fff
  #VT_TYPEMASK = $fff
EndEnumeration

;- Strukturen
Structure VARIANT
  vt.w
  wReserved1.w
  wReserved2.w
  wReserved3.w
  StructureUnion
    llVal.LARGE_INTEGER
    lVal.l
    bVal.b
    iVal.w
    fltVal.f
    dblVal.LARGE_INTEGER
    boolVal.l
    bool.l
    scode.l
    cyVal.l
    date.l
    bstrVal.l
   *punkVal.IUnknown
   *pdispVal.IDispatch
   *parray.l
   *pbVal.BYTE
   *piVal.WORD
   *plVal.LONG
   *pllVal.LARGE_INTEGER
   *pfltVal.FLOAT
   *pdblVal.LARGE_INTEGER
   *pboolVal.LONG
   *pbool.LONG
   *pscode.LONG
   *pcyVal.LONG
   *pdate.LONG
   *pbstrVal.LONG
   *ppunkVal.LONG
   *ppdispVal.LONG
   *pparray.LONG
   *pvarVal.VARIANT
    byref.l
    cVal.b
    uiVal.w
    ulVal.l
    ullVal.LARGE_INTEGER
    intVal.l
    uintVal.l
   *pdecVal.LONG
   *pcVal.BYTE
   *puiVal.WORD
   *pulVal.LONG
   *pullVal.LARGE_INTEGER
   *pintVal.LONG
   *puintVal.LONG                     
    decVal.l
  EndStructureUnion
EndStructure

Structure DISPPARAMS
  *rgvarg;            // Array of arguments.
  *rgdispidNamedArgs;   // Dispatch IDs of named arguments.
  cArgs.l;            // Number of arguments.
  cNamedArgs.l;         // Number of named arguments.
EndStructure


;- ProtoTypes
Prototype.l ProtoAtlAxWinInit()
Prototype.l ProtoAtlAxCreateControl(lpszName.p-unicode, hWnd.l, *pStream, *Container)
Prototype.l ProtoAtlAxGetControl(hWnd.l, *Object)

;- ATL.dll
If OpenLibrary(0, "ATL.dll") = 0
  Debug "Fehler OpenLibrary"
  End
EndIf

;- Init Functions
AtlAxWinInit.ProtoAtlAxWinInit = GetFunction(0, "AtlAxWinInit")
AtlAxCreateControl.ProtoAtlAxCreateControl = GetFunction(0, "AtlAxCreateControl")
AtlAxGetControl.ProtoAtlAxGetControl = GetFunction(0, "AtlAxGetControl")


r1 = CoInitialize_(0)
Debug r1
If r1 <> #S_OK And r1 <> #S_FALSE
  Debug "Fehler CoInitialize"
  End
EndIf


;- TestMain

If 1    ;OpenLibrary(0, "ATL.dll") ; Use the ATL DLL for our container

  If OpenWindow(0, 100, 100, 300, 315, #PB_Window_SystemMenu, "ATL test")

   CreateGadgetList(WindowID(0)) 
      ContainerGadget(0, 10, 10, 280, 270) ; This will be our container window, where the ActiveX will be rendered
      CloseGadgetList()
     
      ButtonGadget(1, 10, 285, 70, 25, "Stop")
      ButtonGadget(2, 90, 285, 70, 25, "Play")
     
    If AtlAxWinInit()
      Debug "AtlAxWinInit Ok..."
      
      AtlAxCreateControl("ADUSB2XX.ADUSB2XXCtrl.1", GadgetID(0), 0, @*Container.IUnknown) ; It always create the IE control even if flash isn't found
      If *Container
        Debug "Container Ok..."
        AtlAxGetControl(GadgetID(0), @*Object.IDispatch)
        If *Object
          
          r1 = *Object\QueryInterface(?IID__DAD_USB2XX, @*MyObject.IDispatch)
          If r1 = #S_OK
            Debug "QueryInterface Ok..."
          Else
            Debug "Fehler " + Hex(r1)
            End
          EndIf
          
          VariantInit_(DeviceNr.variant)
          
          parms.DISPPARAMS
          With parms
            \rgvarg = @DeviceNr        
            \rgdispidNamedArgs = 0
            \cArgs = 1
            \cNamedArgs = 0
          EndWith
          
          DeviceNr\vt =#VT_I2
          For i = 0 To 126
            DeviceNr\iVal = i
            ; Invoke(1,...  = Scan
            r1 = *MyObject\Invoke(1, ?IID_NULL, 0, #DISPATCH_METHOD, @parms, @varResult.VARIANT, 0, 0) = #S_OK
            If r1 = #S_OK
              Debug "Result VarType: " + Str(varResult\vt)
              Debug "Result Value: " + Str(varResult\bool)
            Else
              Debug "Fehler " + Hex(r1)
            EndIf
          Next i
          
          
            Repeat
              Event = WaitWindowEvent()
             
              If Event = #PB_Event_Gadget
             
                Select EventGadget()
                  Case 1

                   
                  Case 2
                EndSelect
              EndIf
             
            Until Event = #PB_Event_CloseWindow
           
          ;  oObject\Release()
          ;EndIf
          *MyObject\Release()
        EndIf
        *Container\Release()
      EndIf
    EndIf
             
    CloseWindow(0)   ; Don't forget this one, else the program will crash
  EndIf   

  CoUninitialize_()
EndIf 
 
End

;- DataSections

DataSection

  IID_NULL: ; {00000000-0000-0000-0000-000000000000}
    Data.l $00000000
    Data.w $0000, $0000
    Data.b $00, $00, $00, $00, $00, $00, $00, $00     

EndDataSection

;- 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

Programm läuft bei mir durch. Teste mal mit angeschlossenen Gerät.

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 »

Sorry, das ích etwas später dran bin.
Grund, ich kämpfe noch mit dem Explorer 7 beta und meinem Homebankingprogramm.

Hier das Ergebnis aus dem Source:
0
AtlAxWinInit Ok...
Container Ok...
QueryInterface Ok...
Result VarType: 11
Result Value: 65535
Result VarType: 11
Result Value: 0
Result VarType: 11
....
....
Result Value: 0
Result VarType: 11
Result Value: 0
Result VarType: 11
Result Value: 0
Im ersten Blick sieht das sehr gut aus.
Wenn ich das richtig sehe, ist dann das Modul auf 11 angemeldet.

Jetzt muss ich nur noch den Source verstehen um z.B. die Versionsnummer dort anzeigen zu lassen bzw. die anderen Funktionen
benutzen zu können.
Viele Grüße
Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten