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 »

Nicht ganz richtig. Mit VarType meine ich den Type von Variant. Type 11 ist BOOL. Hurra es funktioniert.
Hiermit noch an alle User im Forum ein Dankeschön für ihre Beispiele für Variant und ActiveX, wo aus ich das hier gebastelt habe.

Ich habe mir letztens für ein Apfel und ein Ei mir VC5 gekauft und mit rumgespielt. Dabei kam beim anbinden des OCX ein Interner Wrapper raus.
Schreibe dir noch ein beispiel zum umstetzen.

Code: Alles auswählen

/////////////////////////////////////////////////////////////////////////////
// CAD_USB2XX

IMPLEMENT_DYNCREATE(CAD_USB2XX, CWnd)

/////////////////////////////////////////////////////////////////////////////
// Eigenschaften CAD_USB2XX 

/////////////////////////////////////////////////////////////////////////////
// Operationen CAD_USB2XX 

BOOL CAD_USB2XX::Scan(short DeviceNr)
{
	BOOL result;
	static BYTE parms[] =
		VTS_I2;
	InvokeHelper(0x1, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms,
		DeviceNr);
	return result;
}

double CAD_USB2XX::GetAnalogVoltage(short DeviceNr, short Channel)
{
	double result;
	static BYTE parms[] =
		VTS_I2 VTS_I2;
	InvokeHelper(0xd, DISPATCH_PROPERTYGET, VT_R8, (void*)&result, parms,
		DeviceNr, Channel);
	return result;
}

void CAD_USB2XX::SetAnalogVoltage(short DeviceNr, short Channel, double newValue)
{
	static BYTE parms[] =
		VTS_I2 VTS_I2 VTS_R8;
	InvokeHelper(0xd, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
		 DeviceNr, Channel, newValue);
}

short CAD_USB2XX::GetDigIO(short DeviceNr)
{
	short result;
	static BYTE parms[] =
		VTS_I2;
	InvokeHelper(0xe, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, parms,
		DeviceNr);
	return result;
}

void CAD_USB2XX::SetDigIO(short DeviceNr, short nNewValue)
{
	static BYTE parms[] =
		VTS_I2 VTS_I2;
	InvokeHelper(0xe, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
		 DeviceNr, nNewValue);
}

double CAD_USB2XX::GetAnalogDiffVoltage(short DeviceNr, short Channel)
{
	double result;
	static BYTE parms[] =
		VTS_I2 VTS_I2;
	InvokeHelper(0x2, DISPATCH_METHOD, VT_R8, (void*)&result, parms,
		DeviceNr, Channel);
	return result;
}

short CAD_USB2XX::GetDeviceType(short DeviceNr)
{
	short result;
	static BYTE parms[] =
		VTS_I2;
	InvokeHelper(0x3, DISPATCH_METHOD, VT_I2, (void*)&result, parms,
		DeviceNr);
	return result;
}

short CAD_USB2XX::GetError(short DeviceNr)
{
	short result;
	static BYTE parms[] =
		VTS_I2;
	InvokeHelper(0x4, DISPATCH_METHOD, VT_I2, (void*)&result, parms,
		DeviceNr);
	return result;
}

short CAD_USB2XX::GetSerialNr(short DeviceNr)
{
	short result;
	static BYTE parms[] =
		VTS_I2;
	InvokeHelper(0x5, DISPATCH_METHOD, VT_I2, (void*)&result, parms,
		DeviceNr);
	return result;
}

long CAD_USB2XX::GetAnalogIO(short DeviceNr, short Channel)
{
	long result;
	static BYTE parms[] =
		VTS_I2 VTS_I2;
	InvokeHelper(0xf, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, parms,
		DeviceNr, Channel);
	return result;
}

void CAD_USB2XX::SetAnalogIO(short DeviceNr, short Channel, long nNewValue)
{
	static BYTE parms[] =
		VTS_I2 VTS_I2 VTS_I4;
	InvokeHelper(0xf, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
		 DeviceNr, Channel, nNewValue);
}

void CAD_USB2XX::EnableCalibration(LPCTSTR Password)
{
	static BYTE parms[] =
		VTS_BSTR;
	InvokeHelper(0x6, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
		 Password);
}

long CAD_USB2XX::GetCalibration(short DeviceNr, short IO, short Level, short Channel)
{
	long result;
	static BYTE parms[] =
		VTS_I2 VTS_I2 VTS_I2 VTS_I2;
	InvokeHelper(0x10, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, parms,
		DeviceNr, IO, Level, Channel);
	return result;
}

void CAD_USB2XX::SetCalibration(short DeviceNr, short IO, short Level, short Channel, long nNewValue)
{
	static BYTE parms[] =
		VTS_I2 VTS_I2 VTS_I2 VTS_I2 VTS_I4;
	InvokeHelper(0x10, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
		 DeviceNr, IO, Level, Channel, nNewValue);
}

void CAD_USB2XX::SetSerialNr(short DeviceNr, short nNewValue)
{
	static BYTE parms[] =
		VTS_I2 VTS_I2;
	InvokeHelper(0x11, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
		 DeviceNr, nNewValue);
}

double CAD_USB2XX::ReadAnalogVoltage(short DeviceNr, short Channel)
{
	double result;
	static BYTE parms[] =
		VTS_I2 VTS_I2;
	InvokeHelper(0x7, DISPATCH_METHOD, VT_R8, (void*)&result, parms,
		DeviceNr, Channel);
	return result;
}

void CAD_USB2XX::WriteAnalogVoltage(short DeviceNr, short Channel, double Voltage)
{
	static BYTE parms[] =
		VTS_I2 VTS_I2 VTS_R8;
	InvokeHelper(0x8, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
		 DeviceNr, Channel, Voltage);
}

short CAD_USB2XX::ReadDigIn(short DeviceNr)
{
	short result;
	static BYTE parms[] =
		VTS_I2;
	InvokeHelper(0x9, DISPATCH_METHOD, VT_I2, (void*)&result, parms,
		DeviceNr);
	return result;
}

void CAD_USB2XX::WriteDigOut(short DeviceNr, short Value)
{
	static BYTE parms[] =
		VTS_I2 VTS_I2;
	InvokeHelper(0xa, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
		 DeviceNr, Value);
}

void CAD_USB2XX::DataIO(short DeviceNr)
{
	static BYTE parms[] =
		VTS_I2;
	InvokeHelper(0xb, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
		 DeviceNr);
}

void CAD_USB2XX::Close()
{
	InvokeHelper(0xc, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}
Bisschen gedult noch, bin gerade aufgestanden. :doh:
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
Ok,
habe jetzt mal was angefangen.

Hier Download:
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

Habs mir gerade herunter geladen und gestartet.
Ausgabe ist:

1.#INF


Wenn ich am Pin 1 gegen Masse eine Spannung anlege, dann kommt
das Gleiche heraus.

Gruß 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 »

Sag mir mal das ergebnis von:

Code: Alles auswählen

Procedure.d GetAnalogVoltage(*obj.IDispatch, DeviceNr.w, Channel.w)

  Dim Value.Variant(2)
  
  Result.Variant\vt = #VT_EMPTY
  Value(0)\vt = #VT_I2
  Value(0)\iVal = DeviceNr
  Value(1)\vt = #VT_I2
  Value(1)\iVal = Channel
  
  parms.DISPPARAMS
  With parms
    \rgvarg = @Value(0)        
    \rgdispidNamedArgs = 0
    \cArgs = 2
    \cNamedArgs = 0
  EndWith
  
  r1 = *Obj\Invoke($0d, ?IID_NULL, 0, #DISPATCH_PROPERTYGET, @parms, @Result, 0, 0)
  If r1 <> #S_OK
    LastMessage = "Fehler GetAnalogVoltage"
    LastError = $8008010D
    ProcedureReturn 0
  Else
    Debug Result\vt
    Debug Result\dblVal
    ProcedureReturn Result\dblVal  
  EndIf

EndProcedure

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 »

Richtigen Channel eingetragen?
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 »

Vielleicht falsche Funktion. Zum AdWrapper hinzufügen und aufrufen.

Code: Alles auswählen

Procedure.l GetAnalogIO(*obj.IDispatch, DeviceNr.w, Channel.w)

  Dim Value.Variant(2)
  
  Result.Variant\vt = #VT_EMPTY
  Value(0)\vt = #VT_I2
  Value(0)\iVal = DeviceNr
  Value(1)\vt = #VT_I2
  Value(1)\iVal = Channel
  
  parms.DISPPARAMS
  With parms
    \rgvarg = @Value(0)        
    \rgdispidNamedArgs = 0
    \cArgs = 2
    \cNamedArgs = 0
  EndWith
  
  r1 = *Obj\Invoke($0d, ?IID_NULL, 0, #DISPATCH_PROPERTYGET, @parms, @Result, 0, 0)
  If r1 <> #S_OK
    LastMessage = "Fehler GetAnalogIO"
    LastError = $8008010D
    ProcedureReturn 0
  Else
    ProcedureReturn Result\lVal  
  EndIf

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

Ops, falsche ID.

Code: Alles auswählen

Procedure.l GetAnalogIO(*obj.IDispatch, DeviceNr.w, Channel.w)

  Dim Value.Variant(2)
  
  Result.Variant\vt = #VT_EMPTY
  Value(0)\vt = #VT_I2
  Value(0)\iVal = DeviceNr
  Value(1)\vt = #VT_I2
  Value(1)\iVal = Channel
  
  parms.DISPPARAMS
  With parms
    \rgvarg = @Value(0)        
    \rgdispidNamedArgs = 0
    \cArgs = 2
    \cNamedArgs = 0
  EndWith
  
  r1 = *Obj\Invoke($0f, ?IID_NULL, 0, #DISPATCH_PROPERTYGET, @parms, @Result, 0, 0)
  If r1 <> #S_OK
    LastMessage = "Fehler GetAnalogIO"
    LastError = $8008010D
    ProcedureReturn 0
  Else
    ProcedureReturn Result\lVal  
  EndIf

EndProcedure

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 »

OK, das sieht schon super aus. Ich muss das mal alles ausprobieren.
habe folgendes dort im Testprogramm geändert:

Code: Alles auswählen

If i < 127
    IO=GetAnalogIO(*ADUSB, i, 1) 
    Debug GetAnalogVoltage(*ADUSB, i, IO)
    
  Else
    Debug "AD_USB2 nicht gefunden."
  EndIf
und erhalte dann folgenden Wert:

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

Das ist Super. Wenn du Hilfe brauchst um den AdWrapper zu erweitern sag bescheid. Must meinen auszug von VC5 noch umsetzen.
Bei "InvokeHelper(0x5, DISPATCH_METHOD" ist die "0x5" die Funktions ID und auf Dispatch Type achten.

Dim Value.Variant(x) anpassen und anzahl der Parameter in parms\cArgs eintragen.

FF :wink:

Gehe jetzt erstmal weg.
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 »

Ach Ja,
Und Rückgabewert aus Result richtig auslesen

ProcedureReturn Result\iVal für Word
ProcedureReturn Result\lVal für Long
etc

Siehe Global -> Structure -> Variant.

FF
:wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten