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 »

Ich Habe in den letzten Tagen etwas gesucht und experemitiert.
Datei folgendes aus den Englischen Forum geladen.

Code: Alles auswählen

;fold

Enumeration
  #CLSCTX_INPROC_SERVER  = 1
  #CLSCTX_INPROC_HANDLER = 2
  #CLSCTX_LOCAL_SERVER   = 4
  #CLSCTX_REMOTE_SERVER  = 16
  #CLSCTX_SERVER = (#CLSCTX_INPROC_SERVER | #CLSCTX_LOCAL_SERVER | #CLSCTX_REMOTE_SERVER)
EndEnumeration

Structure TYPEATTR
  guid.GUID
  lcid.l
  dwReserved.l
  memidConstructor.l
  memidDestructor.l
  lpstrSchema.l
  cbSizeInstance.l
  typekind.l
  cFuncs.w
  cVars.w
  cImplTypes.w
  cbSizeVft.w
  cbAlignment.w
  wTypeFlags.w
  wMajorVerNum.w
  wMinorVerNum.w
  tdescAlias.l
  idldescType.l
EndStructure

Structure IID  ; Interface Identifier structure. a IID is a 16byte value, that uniquely
  Data1.l       ; identifys each interface.
  Data2.w
  Data3.w
  Data4.w
  Data5.b[6]
EndStructure

Global LastMessage.s
Global LastError.l


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

Procedure.s ShowIID(*iid.IID)
  
  temp.s = RSet(Hex(*iid\Data1), 8, "0") + "-"
  temp.s + RSet(Hex(*iid\Data2), 4, "0") + "-"
  temp.s + RSet(Hex(*iid\Data3), 4, "0") + "-"
  temp.s + RSet(Hex(*iid\Data4), 4, "0") + "-"
  For i = 0 To 5
    temp.s + RSet(Hex(*iid\Data5[i]), 2, "0")
  Next i
  ProcedureReturn temp
EndProcedure

Procedure.l CreateObject(ProgID.s) ; Creates COM object from ProgID

  err.l = CLSIDFromProgID_(Ansi2Uni(ProgID), @CLSID.GUID)
  If err <> #S_OK
    LastError = err
    LastMessage = "Error CLSID From ProgID. Errorcode: " + Hex(err)
    ProcedureReturn 0
  EndIf

  err.l = CoCreateInstance_(CLSID,0,#CLSCTX_SERVER,?IID_IDispatch,@oDispatch.IDispatch)
  If err <> #S_OK
    LastError = err
    LastMessage = "Error CoCreateInstance. Errorcode: " + Hex(err)
    ProcedureReturn 0
  EndIf
  
  If oDispatch\GetTypeInfo(0,lcid,@oDispTypeInfo.ITypeInfo) = #S_OK
    If oDispTypeInfo\GetTypeAttr(@aTypeAttributes.l) = #S_OK
      *oTypeAttributes.TYPEATTR=aTypeAttributes
      IID_OBJECT = *oTypeAttributes\guid
      oDispTypeInfo\ReleaseTypeAttr(aTypeAttributes)
    EndIf
    oDispTypeInfo\Release()
  EndIf

  err.l = oDispatch\QueryInterface(IID_OBJECT,@object.l)
  If err <> #S_OK
    oDispatch\Release()
    LastError = err
    LastMessage = "Error QueryInterface. Errorcode: " + Hex(err)
    ProcedureReturn 0
  EndIf
  oDispatch\Release()

  ProcedureReturn object
EndProcedure

Procedure ReleaseObject(object.l) ; Releases Object from memory
  *object.IUnknown = object
  *object\Release()
EndProcedure

Procedure COMLIB_Init()
  CoInitialize_(#Null)
EndProcedure

Procedure COMLIB_End()
  CoUninitialize_() 
EndProcedure

DataSection
  IID_IDispatch:
  Data.l $00020400
  Data.w $0000, $0000
  Data.b $C0,$00,$00,$00,$00,$00,$00,$46
EndDataSection
 
DataSection
  IID_IUnknown:
  Data.l $00000000
  Data.w $0000, $0000
  Data.b $C0,$00,$00,$00,$00,$00,$00,$46
EndDataSection
;endfold

Das Interface muss noch erweitert werden

Code: Alles auswählen

Interface AdUSB Extends IDispatch
  Scan(Adr)
  GetSerialNr(Adr)
  GetDeviceType(Adr)
  GetError (Adr)
  DigIO (Adr,NewValue)
  AnalogIO (Adr,Cha,NewValue)
  AnalogVoltage (Adr, Cha, NewValue)
  ReadAnalogVoltage(DeviceNr, Channel)
  ReadDigIn(DeviceNr)
  WriteAnalogVoltage(DeviceNr, Channel, Voltage)
  WriteDigOut(DeviceNr, Value)
  DataIO(DeviceNr)
  Close()
EndInterface 
[code]

Aber nach TotalCommander ist dein Interface noch nicht ganz richtig.

Teste mal den Code

COMLIB_Init()
Object.ADUSB = CreateObject("ADUSB2XX.ADUSB2XXCtrl.1")
Debug LastMessage
ReleaseObject(Object)
COMLIB_End()

Konnte nicht Testen, bin nicht Zuhause

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 »

Ich hoffe, ich habe es soweit richtig eingebaut.
Hier erst mal der Source:

Code: Alles auswählen

Enumeration 
  #CLSCTX_INPROC_SERVER  = 1 
  #CLSCTX_INPROC_HANDLER = 2 
  #CLSCTX_LOCAL_SERVER   = 4 
  #CLSCTX_REMOTE_SERVER  = 16 
  #CLSCTX_SERVER = (#CLSCTX_INPROC_SERVER | #CLSCTX_LOCAL_SERVER | #CLSCTX_REMOTE_SERVER) 
EndEnumeration 
;
Interface AdUSB Extends IDispatch 
Scan(Adr) 
GetSerialNr(Adr) 
GetDeviceType(Adr) 
GetError (Adr) 
DigIO (Adr,NewValue) 
AnalogIO (Adr,Cha,NewValue) 
AnalogVoltage (Adr, Cha, NewValue) 
ReadAnalogVoltage(DeviceNr, Channel) 
ReadDigIn(DeviceNr) 
WriteAnalogVoltage(DeviceNr, Channel, Voltage) 
WriteDigOut(DeviceNr, Value) 
DataIO(DeviceNr) 
Close() 
EndInterface 
;
Structure TYPEATTR 
  guid.GUID 
  lcid.l 
  dwReserved.l 
  memidConstructor.l 
  memidDestructor.l 
  lpstrSchema.l 
  cbSizeInstance.l 
  typekind.l 
  cFuncs.w 
  cVars.w 
  cImplTypes.w 
  cbSizeVft.w 
  cbAlignment.w 
  wTypeFlags.w 
  wMajorVerNum.w 
  wMinorVerNum.w 
  tdescAlias.l 
  idldescType.l 
EndStructure 

Structure _IID  ; Interface Identifier structure. a IID is a 16byte value, that uniquely 
  Data1.l       ; identifys each interface. 
  Data2.w 
  Data3.w 
  Data4.w 
  Data5.b[6] 
EndStructure 

Global LastMessage.s 
Global LastError.l 
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 

Procedure.s ShowIID(*iid._IID) 
  
  temp.s = RSet(Hex(*iid\Data1), 8, "0") + "-" 
  temp.s + RSet(Hex(*iid\Data2), 4, "0") + "-" 
  temp.s + RSet(Hex(*iid\Data3), 4, "0") + "-" 
  temp.s + RSet(Hex(*iid\Data4), 4, "0") + "-" 
  For i = 0 To 5 
    temp.s + RSet(Hex(*iid\Data5[i]), 2, "0") 
  Next i 
  ProcedureReturn temp 
EndProcedure 

Procedure.l _CreateObject(ProgID.s) ; Creates COM object from ProgID 

  err.l = CLSIDFromProgID_(Ansi2Uni(ProgID), @CLSID.GUID) 
  If err <> #S_OK 
    LastError = err 
    LastMessage = "Error CLSID From ProgID. Errorcode: " + Hex(err) 
    ProcedureReturn 0 
  EndIf 

  err.l = CoCreateInstance_(CLSID,0,#CLSCTX_SERVER,?IID_IDispatch,@oDispatch.IDispatch) 
  If err <> #S_OK 
    LastError = err 
    LastMessage = "Error CoCreateInstance. Errorcode: " + Hex(err) 
    ProcedureReturn 0 
  EndIf 
  
  If oDispatch\GetTypeInfo(0,lcid,@oDispTypeInfo.ITypeInfo) = #S_OK 
    If oDispTypeInfo\GetTypeAttr(@aTypeAttributes.l) = #S_OK 
      *oTypeAttributes.TYPEATTR=aTypeAttributes 
      IID_OBJECT = *oTypeAttributes\guid 
      oDispTypeInfo\ReleaseTypeAttr(aTypeAttributes) 
    EndIf 
    oDispTypeInfo\Release() 
  EndIf 

  err.l = oDispatch\QueryInterface(IID_OBJECT,@object.l) 
  If err <> #S_OK 
    oDispatch\Release() 
    LastError = err 
    LastMessage = "Error QueryInterface. Errorcode: " + Hex(err) 
    ProcedureReturn 0 
  EndIf 
  oDispatch\Release() 

  ProcedureReturn object 
EndProcedure 

Procedure _ReleaseObject(object.l) ; Releases Object from memory 
  *object.IUnknown = object 
  *object\Release() 
EndProcedure 

Procedure COMLIB_Init() 
  CoInitialize_(#Null) 
EndProcedure 

Procedure COMLIB_End() 
  CoUninitialize_() 
EndProcedure 

COMLIB_Init() 
Object.ADUSB = _CreateObject("ADUSB2XX.ADUSB2XXCtrl.1") 
Debug LastMessage 
_ReleaseObject(Object) 
COMLIB_End() 

DataSection 
  IID_IDispatch: 
  Data.l $00020400 
  Data.w $0000, $0000 
  Data.b $C0,$00,$00,$00,$00,$00,$00,$46 
EndDataSection 
  
DataSection 
  IID_IUnknown: 
  Data.l $00000000 
  Data.w $0000, $0000 
  Data.b $C0,$00,$00,$00,$00,$00,$00,$46 
EndDataSection 
;endfold 
In PB 3.94 läuft der Source und gibt mir im Debugger nur einen Lehrstring aus.

IN PB 4.0 kommt folgende Message:
---------------------------
PureBasic - Linker error
---------------------------
POLINK: error: Unresolved external symbol 'PB_Len'.

POLINK: error: Unresolved external symbol '_SYS_FreeString4'.

POLINK: fatal error: 2 unresolved external(s).

---------------------------
OK
---------------------------
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 »

Leerstring ist Gut. PB4 Keine Ahnung.

Interface eventuell noch anpassen und testen.
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 »

Ich weis jetzt nicht, was ich da noch anpassen soll, da ich das mit dem
OCX im Moment noch nicht verstehe, aber ich habe mal folgendes probiert.

Code: Alles auswählen

Interface AdUSB Extends IDispatch 
Scan(Adr.l) 
GetSerialNr(Adr.l) 
GetDeviceType(Adr.l) 
GetError (Adr.l) 
DigIO (Adr.l,NewValue.l) 
AnalogIO (Adr.l,Cha.l,NewValue.l) 
AnalogVoltage (Adr.l, Cha.l, NewValue.l) 
ReadAnalogVoltage(DeviceNr.l, Channel.l) 
ReadDigIn(DeviceNr.l) 
WriteAnalogVoltage(DeviceNr.l, Channel.l, Voltage.l) 
WriteDigOut(DeviceNr.l, Value.l) 
DataIO(DeviceNr.l) 
Close() 
EndInterface 
Probiert habe ich dann die Ausgabe über
Debug Objekt\Scan(0)

Dann erhalte ich folgende Debuggerausgabe: Invalid memory access.
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 »

Ok, bin wieder zu hause.

Habe aus von dir übermittelten auszug von TotalCommander folgendes Interface geschrieben.

Code: Alles auswählen

Interface AD_USB2XX
  Scan(DeviceNr.w); boolean (Long)
  AnalogVoltage(DeviceNr.w, Channel.w); 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
Teste jetzt die Schnittstelle.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
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 »

Vielleicht sollte ihr die Rückgabewerte auch berücksichtigen:

Code: Alles auswählen

Interface AD_USB2XX
  Scan.l(DeviceNr.w); boolean (Long)
  AnalogVoltage.d(DeviceNr.w, Channel.w); Double
  AnalogVoltage2(DeviceNr.w, Channel.w, rhs.double); Void
  DigIO.w(DeviceNr.w); short
  DigIO2(DeviceNr.w, rhs.w); void
  GetAnalogDiffVoltage.d(DeviceNr.w,Channel.w); Double
  GetDeviceType.w(DeviceNr.w); short
  GetError.w(DeviceNr.w); short
  GetSerialNr.w(DeviceNr.w); short
  AnalogIO.l(DeviceNr.w, Channel.w); long
  AnalogIO2(DeviceNr.w, Channel.w, rhs.l); void
  EnableCalibration(Password.p-bstr); BSTR Unicode ;
  Calibration.l(DeviceNr.w, IO.w, Level.w, Channel.w); long
  Calibration2(DeviceNr.w, IO.w, Level.w, Channel.w, rhs.l); void
  SerialNr.w(DeviceNr.w); short
  SerialNr2(DeviceNr.w, rhs.w); void
  ReadAnalogVoltage.d(DeviceNr.w, Channel.w); double
  WriteAnalogVoltage(DeviceNr.w, Channel.w, Voltage.d); void
  ReadDigIn.w(DeviceNr.w); short
  WriteDigOut(DeviceNr.w, Value.w); void
  DataIO(DeviceNr.w); void
  Close(); void
EndInterface 
Funzt aber nur mit PB4
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
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 »

@ts-soft, leider geht das in pb4 trotzdem nicht, wegen dem Polinkfehler.
siehe oben.

In PB3.94 habe ich die doubles alle zum Test erst mal auf longs gesetzt und das im folgenden source probiert. Ich glaube, das ist noch ein Fehler
drinne.


Code: Alles auswählen

;fold 
; ---------------------------
; PureBasic - Linker error  ==> PB4 beta 3
; ---------------------------
; POLINK: error: Unresolved external symbol 'PB_Len'. 
; 
; POLINK: error: Unresolved external symbol '_SYS_FreeString4'. 
; 
; POLINK: fatal error: 2 unresolved external(s). 
; 
; 
; ---------------------------
; OK   
; ---------------------------

Enumeration 
  #CLSCTX_INPROC_SERVER  = 1 
  #CLSCTX_INPROC_HANDLER = 2 
  #CLSCTX_LOCAL_SERVER   = 4 
  #CLSCTX_REMOTE_SERVER  = 16 
  #CLSCTX_SERVER = (#CLSCTX_INPROC_SERVER | #CLSCTX_LOCAL_SERVER | #CLSCTX_REMOTE_SERVER) 
EndEnumeration 
;
;Interface AD_USB2XX 
Interface AD_USB2XX Extends  IDispatch 
  Scan.l(DeviceNr.w); boolean (Long) 
  AnalogVoltage.l(DeviceNr.w, Channel.w); Double 
  AnalogVoltage2(DeviceNr.w, Channel.w, rhs.double); Void 
  DigIO.w(DeviceNr.w); short 
  DigIO2(DeviceNr.w, rhs.w); void 
  GetAnalogDiffVoltage.l(DeviceNr.w,Channel.w); Double 
  GetDeviceType.w(DeviceNr.w); short 
  GetError.w(DeviceNr.w); short 
  GetSerialNr.w(DeviceNr.w); short 
  AnalogIO.l(DeviceNr.w, Channel.w); long 
  AnalogIO2(DeviceNr.w, Channel.w, rhs.l); void 
  ;EnableCalibration(Password.p-bstr); BSTR Unicode ; 
  Calibration.l(DeviceNr.w, IO.w, Level.w, Channel.w); long 
  Calibration2(DeviceNr.w, IO.w, Level.w, Channel.w, rhs.l); void 
  SerialNr.w(DeviceNr.w); short 
  SerialNr2(DeviceNr.w, rhs.w); void 
  ReadAnalogVoltage.l(DeviceNr.w, Channel.w); double 
  WriteAnalogVoltage(DeviceNr.w, Channel.w, Voltage.l); void 
  ReadDigIn.w(DeviceNr.w); short 
  WriteDigOut(DeviceNr.w, Value.w); void 
  DataIO(DeviceNr.w); void 
  Close(); void 
EndInterface 
;
Structure TYPEATTR 
  guid.GUID 
  lcid.l 
  dwReserved.l 
  memidConstructor.l 
  memidDestructor.l 
  lpstrSchema.l 
  cbSizeInstance.l 
  typekind.l 
  cFuncs.w 
  cVars.w 
  cImplTypes.w 
  cbSizeVft.w 
  cbAlignment.w 
  wTypeFlags.w 
  wMajorVerNum.w 
  wMinorVerNum.w 
  tdescAlias.l 
  idldescType.l 
EndStructure 

Structure _IID  ; Interface Identifier structure. a IID is a 16byte value, that uniquely 
  Data1.l       ; identifys each interface. 
  Data2.w 
  Data3.w 
  Data4.w 
  Data5.b[6] 
EndStructure 

Global LastMessage.s 
Global LastError.l 
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 

Procedure.s ShowIID(*iid._IID) 
  
  temp.s = RSet(Hex(*iid\Data1), 8, "0") + "-" 
  temp.s + RSet(Hex(*iid\Data2), 4, "0") + "-" 
  temp.s + RSet(Hex(*iid\Data3), 4, "0") + "-" 
  temp.s + RSet(Hex(*iid\Data4), 4, "0") + "-" 
  For i = 0 To 5 
    temp.s + RSet(Hex(*iid\Data5[i]), 2, "0") 
  Next i 
  ProcedureReturn temp 
EndProcedure 

Procedure.l _CreateObject(ProgID.s) ; Creates COM object from ProgID 

  err.l = CLSIDFromProgID_(Ansi2Uni(ProgID), @CLSID.GUID) 
  If err <> #S_OK 
    LastError = err 
    LastMessage = "Error CLSID From ProgID. Errorcode: " + Hex(err) 
    ProcedureReturn 0 
  EndIf 

  err.l = CoCreateInstance_(CLSID,0,#CLSCTX_SERVER,?IID_IDispatch,@oDispatch.IDispatch) 
  If err <> #S_OK 
    LastError = err 
    LastMessage = "Error CoCreateInstance. Errorcode: " + Hex(err) 
    ProcedureReturn 0 
  EndIf 
  
  If oDispatch\GetTypeInfo(0,lcid,@oDispTypeInfo.ITypeInfo) = #S_OK 
    If oDispTypeInfo\GetTypeAttr(@aTypeAttributes.l) = #S_OK 
      *oTypeAttributes.TYPEATTR=aTypeAttributes 
      IID_OBJECT = *oTypeAttributes\guid 
      oDispTypeInfo\ReleaseTypeAttr(aTypeAttributes) 
    EndIf 
    oDispTypeInfo\Release() 
  EndIf 

  err.l = oDispatch\QueryInterface(IID_OBJECT,@object.l) 
  If err <> #S_OK 
    oDispatch\Release() 
    LastError = err 
    LastMessage = "Error QueryInterface. Errorcode: " + Hex(err) 
    ProcedureReturn 0 
  EndIf 
  oDispatch\Release() 

  ProcedureReturn object 
EndProcedure 

Procedure _ReleaseObject(object.l) ; Releases Object from memory 
  *object.IUnknown = object 
  *object\Release() 
EndProcedure 

Procedure COMLIB_Init() 
  CoInitialize_(#Null) 
EndProcedure 

Procedure COMLIB_End() 
  CoUninitialize_() 
EndProcedure 

COMLIB_Init() 
Object.AD_USB2XX = _CreateObject("ADUSB2XX.ADUSB2XXCtrl.1") 
Debug LastMessage 
Debug Object\Scan(0); hier taucht dann Invalid memory access auf. 
_ReleaseObject(Object)

COMLIB_End() 

DataSection 
  IID_IDispatch: 
  Data.l $00020400 
  Data.w $0000, $0000 
  Data.b $C0,$00,$00,$00,$00,$00,$00,$46 
EndDataSection 
  
DataSection 
  IID_IUnknown: 
  Data.l $00000000 
  Data.w $0000, $0000 
  Data.b $C0,$00,$00,$00,$00,$00,$00,$46 
EndDataSection 
;endfold 
Bild
Win11 Pro 64-Bit, PB_6.11b1
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 »

>> @ts-soft, leider geht das in pb4 trotzdem nicht, wegen dem Polinkfehler.
Mit der Comlib kann es ja auch nicht klappen, mit dem Source schon eher, aber der braucht wohl auch ein paar Anpassungen. Vor allem ist das Ansi2Uni und umgekehrt ja nicht mehr notwendig, dank pseudo-types. Die haben aber noch nen Bug, also probier mal mit PB3 weiter.
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
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 »

An den pseudotypes habe ich auch schon dran gedacht. Das in PB 3.94 funktioniert leider auch nicht. Aber trotzdem Danke. Mal sehen, wann die nächste Beta herauskommt.
Ob's hilft ist ja eine andere Sache.

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 »

Bin gerade am testen und bleibe hängen.
Invalid Memory Access. Es liegt wohl an der Wertrückgabe von Interface

VARIANT_BOOL Scan(short DeviceNr);
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten