Variablenstruktur für ActivX aufruf

Nutzung, Komponenten, .NET

Moderator: Moderatoren

mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Variablenstruktur für ActivX aufruf

Beitrag von mkersch »

Hallo Forenmitglieder,

für eine Kraftauswertung (HBM) möchte ich die ActivX Schnittstelle benutzen.

1. Ethernet nach vorhandenen HBM Geräten scannen.
MyScanResults := oQXSystem:ScanForQXDevices()


Wie kann ich mein Array bzw. meine Variable unter Xbase definieren, das dies den geforderten Typen entspricht ?

**
** Angabe im Vbasic-Programm
** Dim MyScanResults() As ScanResult

**In der COM API Hilfe habe ich folgendes gefunden.
** public ScanResult(UInt64 UUID, string Name, string ModuleType, string IPAddress, int Port);


Mit freundlichen Grüßen

mkersch
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Variablenstruktur für ActivX aufruf

Beitrag von AUGE_OHR »

hi,

>Wie kann ich mein Array bzw. meine Variable unter Xbase definieren, das dies den geforderten Typen entspricht ?
es klingt jetzt blöd, aber ich meine es wirklich so : ausprobieren !!!
public ScanResult(UInt64 UUID, string Name, string ModuleType, string IPAddress, int Port)
soll ja ein Array zurück geben und ich sehe nicht das du ihm ein Array, mit "Struktur", als Parameter übergeben sollst.
der Type "string" und "Int" sind ja kein Problem ... und was ist UInt64 UUID ?

Die "Bezeichnung" das es sich um ein (VB) Array handelt "könnte" auch auf eine "Collection" hinweisen.
Das wäre dann dann ein Object wo du an die "Elemente" meisten mit :item(nNo) rankommst

In diesem Fall könnte dir VTType() / SafeArray weiterhelfen die (VB) "Collection" in ein Xbase++ Array umzuwandeln.
( siehe Alaska Newsgroup public.xbase++.activex )
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Variablenstruktur für ActivX aufruf

Beitrag von Tom »

Hallo, Mkersch.

Im Umgang mit einem Control namens "ImageKit" hat es mir geholfen, die entsprechende Methode einmal "leer" mit einem Zero-Size-Array (by reference) aufzurufen, um dieses Array quasi von der Methode formatieren zu lassen.

Code: Alles auswählen

aArray := {}

oControl:MyMethod(@aArray, ...) // alle anderen Parameter auf NIL oder Standardwerte
* und dann gleich noch einmal, aber mit den richtigen Daten
Danach hatte das Array das vom Control gewünschte Format, und ich konnte es in der App auswerten.
Herzlich,
Tom
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Re: Variablenstruktur für ActivX aufruf

Beitrag von mkersch »

Vielen Dank für Eure schnellen Antworten.

Leider kann ich mit den VTType() bzw. mit Collection nicht viel anfangen.

Könntet Ihr mir Anhand eines Beispiels "unter die Arme" helfen.

mfg.

Michael
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Variablenstruktur für ActivX aufruf

Beitrag von AUGE_OHR »

mkersch hat geschrieben:Leider kann ich mit den VTType() bzw. mit Collection nicht viel anfangen.

Könntet Ihr mir Anhand eines Beispiels "unter die Arme" helfen.
schon mal im Alaska Forum gesucht ?

Beispiel VB "Datetime" = YYMMDDHHMMSS

Code: Alles auswählen

cStartTime  := DTOS(Date())+STRTRAN("09:30",":","")
oEvent:treatDateAsString(.T.):setProperty("StartTime",VTType():new( cStartTime , VT_DATE))
Beispiel WMI Collection

Code: Alles auswählen

objWMIService  := CreateObject("WbemScripting.SWbemLocator" ):ConnectServer(strComputer, "Root\CIMv2")

   colItems       := objWMIService:ExecQuery("select * from Win32_MotherboardDevice",,48)
   bCollBlock     := {|oService,n| AADD(aItem,{ n,;
     oService:getProperty("Availability"),;
     oService:getProperty("Caption"),;
     oService:getProperty("ConfigManagerErrorCode"),;
     oService:getProperty("ConfigManagerUserConfig"),;
     oService:getProperty("CreationClassName"),;
     oService:getProperty("Description"),;
     oService:getProperty("DeviceID"),;
     oService:getProperty("ErrorCleared"),;
     oService:getProperty("ErrorDescription"),;
     oService:getProperty("InstallDate"),;
     oService:getProperty("LastErrorCode"),;
     oService:getProperty("Name"),;
     oService:getProperty("PNPDeviceID"),;
     oService:getProperty("PowerManagementCapabilities"),;
     oService:getProperty("PowerManagementSupported"),;
     oService:getProperty("PrimaryBusType"),;
     oService:getProperty("RevisionNumber"),;
     oService:getProperty("SecondaryBusType"),;
     oService:getProperty("Status"),;
     oService:getProperty("StatusInfo"),;
     oService:getProperty("SystemCreationClassName") })}

   ComEvalCollection(colItems, bCollBlock )
du solltest wirklich es "probieren" und uns dann das "Ergebnis" mitteilen wenn was nicht klappt was er "meldet"
gruss by OHR
Jimmy
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Re: Variablenstruktur für ActivX aufruf

Beitrag von mkersch »

AUGE_OHR danke für die Antwort.

Da ich noch keinen Lösungsweg sehe nochmals meine Aufgabenstellung.

Zur Auswertung von Kraftwerten muss ich mittels einer "COM / ActiveX" Schnittstelle die Daten einlesen.

Als Beispiel ist ein VBasic Programm mitgeliefert.

Mit der Methode ScanForQXDevice() wird über die Ethernet Schnittstelle jedes HBM Gerät eingelesen.
In einem Array (???) wird das Ergebnis abgelegt.

In VB ==> MyScanResult(1).UUID // UINT64
MyScanResult(1).Name // String
MyScanResult(1).Module.Typ // String
MyScanResult(1).IPAdresse // String
MyScanResult(1).Port // INT

MyScanResult(2).UUID // zweites Gerät UINT64
usw.

MyScanResults := oQXSystem:ScanForQXDevices()

Da in meiner XbaseHilfe VTType() und ComEvalCollection nicht beschrieben sind, finde ich noch keinen Ansatz diese Aufgabenstellung zu lösen.
Außerdem habe ich in den Newsgroup's keine entsprechenden Hinweise gefunden.

mfg.
mkersch
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Variablenstruktur für ActivX aufruf

Beitrag von brandelh »

Hi,

Ein Variant unter VB ist das was wir schon lange kennen, eine Variable, die den Typ ändern kann.
Allerdings kann VB und die übersetzende Xbase++ Schnittstelle den richtigen Datentyp nicht erraten,
dieser wird - soviel ich weiß - mit VTType() übergeben. Ich meine das in den ActiveX Beispielen gelesen zu haben.

Die Suche nach "xbase VTType" bei Google ergab einige Treffer ...

Code: Alles auswählen

oCalendarItem:StartTime := VTType():new( "20090815090000", VT_DATE)
daraus ersieht man, dass VTType() eine Xbase++ Klasse ist, die einen Wert in ein spezielles Variant Datenformat wandelt. Auf meiner Platte finde ich nichts zu VTType() ... vielleicht hier im Forum, wobei man nach VTType* suchen muss...

VT_DATE mit den anderen Datentypen ist der Online-Hilfe erwähnt, vermutlich ist VTType() dass ab und an angesprochen wird nur direkt bei Alaska zu bekommen.

Dein VB Array ist komplexer, es handelt sich um ein Array mit Strukturen (TYPE ...).
Für Strukturen benutzt man am besten die ot4xb on :arrow: http://www.xbwin.com

Wenn du eine saubere Struktur baust, könnte die Typwandlung ein ein solches Element wieder automatisch funktionieren, leider habe ich aber mit ActiveX nur begrenzte Erfahrung.

Ich hoffe es hilft etwas ;-)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Variablenstruktur für ActivX aufruf

Beitrag von AUGE_OHR »

mkersch hat geschrieben:Da in meiner XbaseHilfe VTType() und ComEvalCollection nicht beschrieben sind
hm ... äh ... wir sprechen von der SL1 v1.9.355, oder ?
solltes du noch < SL1 haben musst du erst mal updaten da es erst ab v1.9.355 die Funktion ComEvalCollection() gibt.
mkersch hat geschrieben:Außerdem habe ich in den Newsgroup's keine entsprechenden Hinweise gefunden.
ich meine in der Alaska Newsgroup
mkersch hat geschrieben:nochmals meine Aufgabenstellung ...
ich denke schon das ich grundsätzlich deine Frage verstehe, aber das "ausprobieren" musst du schon selbst.

Ich gehe zwar davon aus das dein *.OCX auf IDispatch basiert, aber das muss man "ausprobieren" ob man es überhaupt aus Xbase++ "ansprechen" kann.

Wenn du "Ergebnisse" hast können wir weiter darüber reden, aber dazu benötigen wir "Code".
gruss by OHR
Jimmy
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Re: Variablenstruktur für ActivX aufruf

Beitrag von mkersch »

Guten Tag Forenmitglieder

Code: Alles auswählen

      oQXSystem := GetObject( ,"HBM.QuantumX.QXSystem_" )
      IF NIL == oQXSystem
        ? "Fehler: ", ComLastError()
        ? "Beschreibung:"
        ? ComLastMessage()
        RETURN
      ENDIF
      oTest := oQXSystem:ScanForQXDevices()
Die Zeile mit ScanForQXDevices() bring eine Fehlermeldung:

Fehler BASE/5 Beschreibung : Ungültiger numerischer Wert für Operation Operation : <1> <= <1> Thread ID : 1 Aufgerufen von AUTOMATIONOBJECT:NOMETHOD(1234)

Was mache ich falsch ?

mfg.
mkersch
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Variablenstruktur für ActivX aufruf

Beitrag von brandelh »

mkersch hat geschrieben:Was mache ich falsch ?
Aufgrund der Fehlermeldung übergibst du den falschen Parameter oder den richtigen falsch ;-)

So nun im Ernst, offensichtlich hat hier außer dir niemand diese Hard-/Software und daher sind wir auf deine Infos angewiesen. Wir wissen z.B. nichts über die nötigen Parameter dieser Methode ...

Es wäre nützlich, wenn du ein komplettes funktionierendes Beispiel in C oder VB hier zeigen könntest.
Eine Mischung aus VB Rückgabewerten und Xbase++ Aufrufen wird keine Antworten zu Tage fördern.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Variablenstruktur für ActivX aufruf

Beitrag von AUGE_OHR »

mkersch hat geschrieben:

Code: Alles auswählen

      oQXSystem := GetObject( ,"HBM.QuantumX.QXSystem_" )
      IF NIL == oQXSystem
        ? "Fehler: ", ComLastError()
        ? "Beschreibung:"
        ? ComLastMessage()
        RETURN
      ENDIF
      oTest := oQXSystem:ScanForQXDevices()
Die Zeile mit ScanForQXDevices() bring eine Fehlermeldung:

Fehler BASE/5 Beschreibung : Ungültiger numerischer Wert für Operation Operation : <1> <= <1> Thread ID : 1 Aufgerufen von AUTOMATIONOBJECT:NOMETHOD(1234)
die Zeile 1234 ist es sicherlich nicht ... kommt er wirklich bis zu der Zeile ???

da du keine Parameter angegeben hast, kommt der erste Teil der Fehlermeldung : Operation : <1> <= <1>

NOMETHOD heisst das was es sagt : Die Methode gibt es ("so") nicht ... oder ist es vielleicht eine Property ?
auch sagte ich ja das Xbase++ nur IDispatch kann ... könnte sein das es zu den anderen 50% gehört ?

Ich würde deshalb versuchen zuerst die Methode :About "testen" die fast jedes OCX hat

wie Hubert schon sagte, wir brauchen deutlich mehr Informationen ( Url, VB oder C Sample )
um zu helfen

p.s. GetObject setzt voraus das du eine Instanz laufen hast. CreateObject wäre besser.
Wenn du allerdings auf das activeX "reagieren" willst, musst du über das XbpActiveXControl() und :SubscribeEvent() gehen
gruss by OHR
Jimmy
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Re: Variablenstruktur für ActivX aufruf

Beitrag von mkersch »

Vielen Dank für die Info

Heute habe ich den ganzen Tag versucht an mein Kraftmesssystem zu kommen, leider ohne Erfolg.

Mit den VBasic Beispiel klappt es sofort.

Code: Alles auswählen

Dim QXSystem As QXSystem_
Dim QXSimpleDAQ As QXSimpleDAQ_

Dim MyDevice As Device
Dim MyScanResults() As ScanResult


Sub init()
Set QXSystem = New QXSystem_
Set QXSimpleDAQ = New QXSimpleDAQ_



End Sub










Sub AddToProtocol(message As String)
'Text1.Text = Text1.Text + message
RichTextBox1.Text = RichTextBox1.Text + message
RichTextBox1.SelStart = Len(RichTextBox1.Text)
End Sub



Private Sub ClearText_Click()
'Text1.Text = ""
'Text1.
RichTextBox1.Text = ""

End Sub



Private Sub ConnectToFirstDevice_Click()
  On Error GoTo ErrorHandler1
  If (UBound(MyScanResults) > -1) Then
     Dim result As String
     AddToProtocol (vbNewLine + "Try to connect to device : " + MyScanResults(0).Name + ", " + MyScanResults(0).IpAddress + ", " + MyScanResults(0).UUID_ + vbNewLine)
     result = QXSystem.Connect(MyScanResults(0).IpAddress, MyScanResults(0).Port)
     'all connected devices (and later also their subdevices!!) are added into two lists!:
     'List1: QXSystem.SubDevicesLinear       : devices and their subdevices are added without hierarchy information
     'List2: QXSystem.SubDevicesHierarchical : devices are added and subdevices are stored under their parent devices
     'MsgBox ("DeviceUUID=" + result)
     'Dim MySubDevices() As SubDevice
     'MySubDevices = QXSystem.SubdevicesLinear
     AddToProtocol (vbNewLine + "Successfully connected to device! " + vbNewLine)
  End If
           
Exit Sub

ErrorHandler1:
  MsgBox (Err.Description)
  'Resume Next

End Sub

Private Sub CreateAndAssignASignal_Click()
On Error GoTo errorhandler

  'Signals for CANBus are of type AsyncSignal!
  'If you want to assign an AsyncSignal to a CAN channel, you have to assert
  'that the connector is of type CANBUS!
  'e.g.:
  'Dim MyConnector As New Connector
  'MyConnector.ActiveType = eConnectorTypes_CANBUS
  'MyConnector.Number = 0
  'QXSystem.AssignConnector MyScanResults(0).UUID_, MyConnector
  'Dim MyAsyncSignal As New AsyncSignal
  'MyAsyncSignal.MaxRepTime_ = 10
  'QXSystem.AssignAsyncSignal MyScanResults(0).UUID_, 0, 0, MyAsyncSignal
  
  
  'Signals for ANALOG_IN_CHANNELs are of type SyncSignal!
  'Lets assign a SyncSignal to the first connector
  'Assert that the first connector is of type ANALOG_IN_CHANNEL:
  Dim MyConnector As New Connector
  MyConnector.ActiveType = eConnectorTypes_ANALOG_IN_CHANNEL
  MyConnector.Number = 0
  QXSystem.AssignConnector MyScanResults(0).UUID_, MyConnector
  'Assign a SyncSignal
  Dim MySyncSignal As New SyncSignal
  MySyncSignal.FilterType.ActiveType = eFilterTypes_LOWPASS
  MySyncSignal.FilterType.LowPass.FilterCharacteristic = eFilterCharacteristics_BESSEL
  MySyncSignal.FilterType.LowPass.FilterFrequency_ = 100
  MySyncSignal.Number = 0
  'and assign it to the first connector...
  QXSystem.AssignSyncSignal MyScanResults(0).UUID_, 0, MySyncSignal
  AddToProtocol vbNewLine + "ModifySettings:AssignSSyncSignal: " + MyScanResults(0).Name + " ," + MyScanResults(0).UUID_ + ":" + vbNewLine + MySyncSignal.ConvertToXML + vbNewLine
  
Exit Sub

errorhandler:
AddToProtocol vbNewLine + "AssignSignal: Exception occured: " + Err.Description + vbNewLine
'Get detailed information about the problems that occured assigning the signal
Dim Problems() As Problem
Problems = QXSystem.ReadLastProblems
AddToProtocol Str(UBound(Problems) + 1) + " problems occured:" + vbNewLine
For i = 0 To UBound(Problems)
  AddToProtocol "Problem: " + Problems(i).Text + ":" + Problems(i).Value + vbNewLine
Next

End Sub

Private Sub CreateAndAssignSensor_Click()
On Error GoTo errorhandler

  'Let's setup a BridgeSensor (see how intellisense supports you!!)
  Dim MySensor As New Sensor
  
  'Determine the type of sensor....
  MySensor.SensorType.ActiveType = eSensorTypes_BRIDGE
  'and set up its properties...
  MySensor.SensorType.Bridge.BridgeType = eBridgeTypes_FULL
  MySensor.SensorType.Bridge.ExciteAmplitude_ = 5
  MySensor.SensorType.Bridge.MaxElectrical_ = 10
  MySensor.SensorType.Bridge.Wiring = eWirings_WIRE_6
  
  'Determine the scaling type of the sensor
  MySensor.ScalingType.ActiveType = eScalingTypes_ZEROSPAN
  'and set up its properties...
  MySensor.ScalingType.ZeroSpan.ElectricalSpan_ = 10
  MySensor.ScalingType.ZeroSpan.ElectricalZero_ = 0
  MySensor.ScalingType.ZeroSpan.PhysicalSpan_ = 100

  'Let's try to assing this sensor to the the first connector of the first connected device
  'Notice that Connectors start with number 0 (in contrast to the labeling on the physical device).
  'We have to be shure that the connector is of type ANALOG_IN_CHANNEL - otherwise assigning the
  'sensor will not work (the connector could be OFF or of type CANBUS)...
  Dim MyConnector As New Connector
  MyConnector.ActiveType = eConnectorTypes_ANALOG_IN_CHANNEL
  MyConnector.Number = 0
  QXSystem.AssignConnector MyScanResults(0).UUID_, MyConnector
  'Assign the sensor
  QXSystem.AssignSensor MyScanResults(0).UUID_, 0, MySensor
  AddToProtocol vbNewLine + "ModifySettings:AssignSensor: " + MyScanResults(0).Name + " ," + MyScanResults(0).UUID_ + ":" + vbNewLine + MySensor.ConvertToXML + vbNewLine
  
  Exit Sub

errorhandler:

  AddToProtocol vbNewLine + "AssignSensor: Exception occured: " + Err.Description + vbNewLine
  'Get detailed information about the problems that occured assigning the sensor
  Dim Problems() As Problem
  Problems = QXSystem.ReadLastProblems
  
  AddToProtocol Str(UBound(Problems) + 1) + " problems occured:" + vbNewLine
  For i = 0 To UBound(Problems)
    AddToProtocol "Problem: " + Problems(i).Text + ":" + Problems(i).Value + vbNewLine
  Next
  
End Sub

Private Sub DisconnectDevice_Click()

QXSystem.Disconnect MyScanResults(0).IpAddress, MyScanResults(0).Port
AddToProtocol vbNewLine + "Disconnect device: " + MyScanResults(0).Name + ", " + MyScanResults(0).IpAddress + ", " + MyScanResults(0).UUID_ + vbNewLine

End Sub

Private Sub ExploreDevice_Click()

Dim Connectors() As Connector

'Explore the Device using the Connectors(0..n)! (use intellisense in your debugger!!)

If (MyDevice = Null) Then
  MsgBox ("Please connect to a device before you explore it... or just use this devicedummy")
  Set MyDevice = New Device
End If

Connectors = MyDevice.Connectors

AddToProtocol vbNewLine + vbNewLine + "Some details about the connected device:" + vbNewLine
AddToProtocol "Name of the device = " + MyDevice.System.ModuleName + vbNewLine
AddToProtocol "Number of connectors = " + Str(UBound(Connectors) + 1) + vbNewLine

AddToProtocol "Sensortypes that are connected at the connectors: " + vbNewLine

For i = 0 To UBound(Connectors)
  AddToProtocol "Sensortype at connector(" + Str(i) + ")=" + Str(Connectors(i).AnalogInChannel.Sensor.SensorType.ActiveType) + vbNewLine
  AddToProtocol "Channelname at connector(" + Str(i) + ")=" + Connectors(i).AnalogInChannel.ChannelName + vbNewLine
Next





End Sub

Private Sub Form_Load()
init

End Sub

Private Sub Form_Unload(Cancel As Integer)
QXSystem.Unload
End Sub




Private Sub GetAvailableNetworkAdapters_Click()
AddToProtocol ("Framework.dll Version=" + QXSystem.ReadDllVersion())

Dim Adapters() As NetworkAdapter


Adapters = QXSystem.ReadNetworkAdapters
AddToProtocol vbNewLine + "Number of available network adapters= " + Str(UBound(Adapters) + 1) + vbNewLine

For i = 0 To UBound(Adapters)
  AddToProtocol "Adapter " + Str(i) + ":" + vbNewLine
  AddToProtocol ("AdapterName      :" + Adapters(i).AdapterName + vbNewLine)
  AddToProtocol ("Description      :" + Adapters(i).Description + vbNewLine)
  AddToProtocol ("IPAddress        :" + Adapters(i).IpAddress + vbNewLine)
  AddToProtocol ("PhysicalAddress  :" + Adapters(i).PhysicalAddress + vbNewLine)
  AddToProtocol ("AdapterType      :" + Adapters(i).AdapterType + vbNewLine)
Next


End Sub


Private Sub GetMeasurementValues_Click()
On Error GoTo errorhandler
  'Get the measurement values
  'To get the measurement values you have to do 2 things:
  '1. Let the API get the measurement-values-datablock of all devices that are part of the measurement
  'We just use one device here - since we are connected to one device only.
  '2. Get the measurement values of the subcribed signals.

  AddToProtocol vbNewLine + "Get measurement values " + vbNewLine
  
  Dim values As MeasurementValues
  Dim NumberOfMeasurementValues As Long
  Dim myValues() As Double
  
  '1.
  QXSimpleDAQ.GetDataBlock
  'Now all measurement values are distributed to the corresponding buffers of the subscribed signals

  '2. Get the measurement values of the signals (we subscribed 3 signals)
  For i = 0 To 2
      NumberOfMeasurementValues = QXSimpleDAQ.GetSignalData(i, values)
      AddToProtocol "Number of accumulated measurement values of channel " + Str(i) + ": " + Str(NumberOfMeasurementValues) + vbNewLine
      'have a look into the values object (e.g. while debugging here..)
      'myValues = values.values
  Next
Exit Sub

errorhandler:
     AddToProtocol vbNewLine + "Get measurement values: Exception occured: " + Err.Description + vbNewLine
End Sub

Private Sub ReadDevice_Click()
Dim SubdevicesLinear() As SubDevice
SubdevicesLinear = QXSystem.SubdevicesLinear

  If (UBound(SubdevicesLinear) > -1) Then
      'there is at least one connected device!
      'get an object representation of that device!
    
      Set MyDevice = QXSystem.ReadDevice(SubdevicesLinear(0).UUID_)
      AddToProtocol ("\nRead device with UUID: " + SubdevicesLinear(0).UUID_ + ":" + vbNewLine + MyDevice.ConvertToXML + vbNewLine)
  Else
      AddToProtocol (vbNewLine + "NO no .. You first have to connect a device!" + vbNewLine)
  End If
          
End Sub

Private Sub ReadSingleMeasurementValue_Click()
'Please notice: This function does not work within the IDE...
  
  On Error GoTo errorhandler
  
'  Dim MyDoubles() As Double
'  Dim MyStati() As Long
'  Call QXSimpleDAQ.GetSingleShot(MyScanResults(0).UUID_, False, MyDoubles, MyStati)

  
  
  Dim MeasurementVal As Single
  Dim MeasurementVal_2 As Double
  Dim MyConnectorType As eConnectorTypes
  
  
   QXSimpleDAQ.GetSinglePoint MyScanResults(0).UUID_, 0, 0, 0, eConnectorTypes_ANALOG_IN_CHANNEL, MeasurementVal
  'QXSimpleDAQ.GetSinglePoint_2 MyScanResults(0).UUID_, 0, 0, eScaleType_SCALETP_NONE, MeasurementVal_2
  AddToProtocol vbNewLine + "Read single measurment: value= " + Str(MeasurementVal) + vbNewLine
  Exit Sub
          
errorhandler:
  AddToProtocol vbNewLine + "Read single measurement value: Exception occured: " + Err.Description + vbNewLine

End Sub

Private Sub ScanForQXDevices_Click()

  MyScanResults = QXSystem.ScanForQXDevices
                
  AddToProtocol (vbNewLine + "Scan for QuantumX devices: " + Str(UBound(MyScanResults) + 1) + " Device(s) found:" + vbNewLine)
  
  For i = 0 To UBound(MyScanResults)
  
    AddToProtocol (MyScanResults(i).Name + ", " + MyScanResults(i).IpAddress + ", " + MyScanResults(i).UUID_ + vbNewLine)
  Next
  
End Sub





Private Sub SetupMeasurement_Click()
  'There are 2 ways of getting measurement values:
  '1. Repeatedly calling GetSinglePoint, GetSingleShot ...
  '2. Subscribe signals - start measurement - get values - stop measuremnt
  'In the following example we use the second way to get measurement values.
  'To setup a measurement you first have to "subscribe" all signals that are part of the measurement.

On Error GoTo errorhandler
  'Subcribe signals (signal number 1 of channel1, channel2 and channel 3)
  QXSimpleDAQ.SubscribeSignal MyScanResults(0).UUID_, 0, 0, 0, eConnectorTypes_ANALOG_IN_CHANNEL, 0, 10000
  QXSimpleDAQ.SubscribeSignal MyScanResults(0).UUID_, 1, 0, 0, eConnectorTypes_ANALOG_IN_CHANNEL, 1, 10000
  QXSimpleDAQ.SubscribeSignal MyScanResults(0).UUID_, 2, 0, 0, eConnectorTypes_ANALOG_IN_CHANNEL, 2, 10000
    
  'QXSimpleDAQ.SubscribeSignal MyScanResults(0).UUID_, 0, 0, 0, eConnectorTypes_CANBUS, 0, 10000
  'QXSimpleDAQ.SubscribeSignal MyScanResults(0).UUID_, 0, 1, 0, eConnectorTypes_CANBUS, 0, 10000
  'QXSimpleDAQ.SubscribeSignal MyScanResults(0).UUID_, 0, 2, 0, eConnectorTypes_CANBUS, 0, 10000
  AddToProtocol vbNewLine + "Setup measurement: 3 signals subscribed:" + vbNewLine
  
  Exit Sub
  
errorhandler:
  AddToProtocol vbNewLine + "Setup measurement: Exception occured: " + Err.Description + vbNewLine
End Sub


Private Sub StartMeasurement_Click()
  'Start the measurement
  On Error GoTo errorhandler
  
  QXSimpleDAQ.StartDAQ False
  AddToProtocol vbNewLine + "Measurement started" + vbNewLine
  
  Exit Sub
  
errorhandler:
      AddToProtocol vbNewLine + "Start measurement: Exception occured: " + Err.Description + vbNewLine
End Sub


Private Sub StopMeasurement_Click()
  'Stop the measuring
  QXSimpleDAQ.StopDAQ
  AddToProtocol vbNewLine + "Measurement stopped" + vbNewLine
End Sub

Mit Xbase gibt es immer noch eine Fehlermeldung

Code: Alles auswählen


// Erzeugen einer Word Anwendung mit CreateObject()
#pragma library( "ascom10.lib" )


// public ScanResult(UInt64 UUID, string Name, string ModuleType, string IPAddress, int Port);


#include "activex.ch"

   PROCEDURE Main
      LOCAL oQXSystem,oQXSimpleDAQ

      local test
      local NullArgs
      local oTest
      local result

      oQXSystem := CreateObject( "HBM.QuantumX.QXSystem_" )
      oQXSimpleDAQ := CreateObject( "HBM.QuantumX.QXSimpleDAQ_" )
//      oQXSystem := GetObject( ,"HBM.QuantumX.QXSystem_" )
//      oQXSimpleDAQ := GetObject(, "HBM.QuantumX.QXSimpleDAQ_" )

      IF NIL == oQXSystem
        ? "Fehler: ", ComLastError()
        ? "Beschreibung:"
        ? ComLastMessage()
        RETURN
      ENDIF
	result := oQXSystem:Connect("192.168.0.20",bin2l("5001"))
//    oQXSystem:ScanForQXDevices(bin2i("0"))
       IF NIL == oQXSimpleDAQ
        ? "Fehler: ", ComLastError()
        ? "Beschreibung:"
        ? ComLastMessage()
        RETURN
      ENDIF


      oQXSystem:quit()
      // Auflösen der Referenz
      oQXSystem:destroy()
      oQXSimpleDAQ:quit()
      // Auflösen der Referenz
      oQXSimpleDAQ:destroy()
   inkey(0)
   RETURN
Die folgende Zeile bringt die Fehlermeldung

result := oQXSystem:Connect("192.168.0.20",bin2l("5001"))

---------------------------
Xbase++ Fehlermeldung
---------------------------
Fehler Automation/6500 Beschreibung : Connection failed. Error in framework: #-1000620 TCP: Connect failed Operation : Connect Thread ID : 1 Betriebsystem Fehler : -2146232832 Called from MAIN(33)
---------------------------
OK Abbrechen
---------------------------

Was soll ich noch versuchen ?

mfg.

mkersch
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Variablenstruktur für ActivX aufruf

Beitrag von Jan »

Bist Du "Schuld" an PDR 6295?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Variablenstruktur für ActivX aufruf

Beitrag von brandelh »

Hi,

wenn bin2l("5001") irgendetwas mit der Zahl 5001 zu tun hat, dann ist das auf jeden Fall falsch.
Ich weiß auch nicht, ob man den "BIN" Wert direkt so angeben kann, was sollte das auch bringen ?

Welchen Wert möchtest du wie übergeben ?

Der VB Quellcode ist niederschmetternd umfangreich und viele seltsame AS / IS Verweise ... das sieht übel aus :-(
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Variablenstruktur für ActivX aufruf

Beitrag von AUGE_OHR »

mkersch hat geschrieben:Xbase++ Fehlermeldung
---------------------------
Fehler Automation/6500 Beschreibung : Connection failed. Error in framework: #-1000620 TCP: Connect failed Operation : Connect Thread ID : 1 Betriebsystem Fehler : -2146232832 Called from MAIN(33)
leider finde ich -2146232832 nicht in meiner Errorliste, aber wenn ich danach "google" dann scheint es ein Init Problem zu sein.

Frage : gibt es von dem activeX eine Demo ? URL ?
mkersch hat geschrieben:Mit den VBasic Beispiel klappt es sofort
... was nichts für Xbase++ zu sagen hat.
wie ich schon sagte funktionieren, mit Xbase++ v1.9.3xx nur activeX die auf IDispatch aufbauen ... also 50% ...

... ich würde nun es mit h... oder Windev versuchen ob man da ran kommt ...
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Variablenstruktur für ActivX aufruf

Beitrag von AUGE_OHR »

mkersch hat geschrieben:für eine Kraftauswertung (HBM)
ist das von http://www.hbm.com ?
wenn ja, ist das activeX von catman® ?
wenn ja, hast du unter http://www.hbm.com/de/menu/anwendungen/ ... beispiele/die Beispiele und "Knowledge Base" gesehen ?

ich würde bei dem Hersteller anfragen ob das activeX von IDispatch abgeleitet ist.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Variablenstruktur für ActivX aufruf

Beitrag von brandelh »

Hi,

wenn es um hardware nahe Steuerungen geht ist Xbase++ nicht gerade erste Wahl.
Aber man kann natürlich die Steuerung in einer anderen Sprache machen und dann selbst die
Werte an Xbase++ weitergeben.

Mit VB habe ich da keine Erfahrung, c/c++ wäre wohl am einfachsten oder delphi ... ich würde PowerBasic nehmen ;-)
Damit könnte man Funktionen / DLL erstellen die dann die Umsetzungen vornehmen.

Pablo ( www.xbwin.com ) hat da viel Erfahrung und erledigt Auftragsarbeiten.

Wenn Ihr niemanden habt der die Schnittstellen bedienen kann, schickt mal eine eMail an Pablo ...
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Variablenstruktur für ActivX aufruf

Beitrag von brandelh »

Hi,

ich habe Pablo mal das Problem so gut es ging geschildert und versuche mich an einer Übersetzung der Antwort ... ;-)
falls jemand einen Fehler in der Übersetzung findet, bitte mitteilen.
Pablo hat geschrieben: > public ScanResult(UInt64 UUID, string Name, string ModuleType, string IPAddress, int Port)
is a very common prototype, the only trouble is that Alaska don't document how to provide the value for
VtType():New( uValue , VT_UI8 )
uValue := 8bye string?, {LoInt32,HiInt32}?, numeric?
or if is able to handle it

Code: Alles auswählen

public ScanResult(UInt64 UUID, string Name, string ModuleType, string IPAddress, int Port)
ist ein ganz normaler Prototyp, das einzige Problem daran ist, dass Alaska nicht dokumentiert wie man einen Wert wie VtType():New( uValue , VT_UI8 ) übergibt.
Eventuell ist auch gemeint, dass VtType() überhaupt nicht dokumentiert ist.

Wird für uValue ein uValue := 8byte string erwartet ?
eventuell in lo hi order {LoInt32,HiInt32} ? oder soll er numerisch sein und Xbase++ kümmert sich darum ?
Kann die Xbase++ ActiveX Schnittstelle diese Aufgabe überhaupt erledigen ?
(gemeint sind wohl Typen von Parametern etc.)
Pablo hat geschrieben:But there are some other approaches if the Alaska guys don't give support for this:
Falls Alaska dies nicht unterstützt, gibt es andere Lösungsansätze:
Pablo hat geschrieben:Havving the TLB or the C++ headers can be called just using
IFpQCall( nMethod , "__sl__uqc_swc_swc_sw__sl",pInterface, uUuid, cName, cModuleType,cIP, nPort )
where nMethod is the position of the method inside in the VTBL ( very easy to know having the TLB or the C headers)
pInterface can be obtained from oAxObject:interface
uUuid can be 8byte string, {LoInt32Part,HiInt32Part} , xbase numeric , or an ot4xb LARGE_INTEGER or ULARGE_INTEGER object
any of this cases cases will be properly converted
c_sw make automatic Ansi->unicode conversion so string parameters can be just Xbase++ ansi strings
Wenn man die TLB (was ist das ?) oder die C++ header hat (also ein C++ Beispiel), kann man mit Pablos ot4xb Tools die Methoden direkt aufrufen.

Code: Alles auswählen

IFpQCall( nMethod , "__sl__uqc_swc_swc_sw__sl",pInterface, uUuid, cName, cModuleType,cIP, nPort )
wobei nMethod die Postion der nötigen Methode in der VTBL ist. Also der Methodenindex/ID.
nMethod ist sehr einfach aus den TLB oder C headers herauszulesen (wenn er das sagt ;-) ).
pInterface kann einfach aus oAxObject:interface geladen werden.
uUuid kann entweder ein 8byte string, {LoInt32Part,HiInt32Part}, eine xbase Zahl oder ein ot4xb LARGE_INTEGER or ULARGE_INTEGER object sein.
Jeder dieses Datentypen sollte richtig konvertiert werden (automatisch ?)
c_sw erledigt die Ansi->unicode Umsetzung automatisch, somit kann dieser Parameter einfach als Xbase++ ansi string angegeben werden (NICHT OEM ?)
Pablo hat geschrieben: Whithout the TLB must use invoke that maybe easy and fast using a small C++ wrapper
Maybe you can translate this to german and put quoted in the forum
Regards,
Pablo
Ohne TLB muss man ein kleines C++ wrapper Programm nutzen um die Aufrufe zu verpacken.
Er bat mich, das hier zu übersetzen und zu veröffentlichen, was ich gerne tue.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Variablenstruktur für ActivX aufruf

Beitrag von Martin Altmann »

TLB müsste für Type LiBrary (Typenbibliothek) stehen.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Variablenstruktur für ActivX aufruf

Beitrag von brandelh »

Klar doch, jetzt wo du es schreibst =D>
Gruß
Hubert
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Re: Variablenstruktur für ActivX aufruf

Beitrag von mkersch »

Vielen Dank für Eure Unterstützung

==> E-Mail an Fa. HBM

wir setzen schon seit vielen Jahren HBM Messtechnik ein.

Auf der Sensor-Messe in Nürnberg habe ich mit Ihnen, zwecks Kommunikation zu MX840, gesprochen.
Sie haben mir empfohlen mit der QuantumX API COM auf das MX840 Gerät zuzugreifen.

Dies funktioniert auch mit dem mitgelieferte VBasic (VB6) Programm einwandfrei.


Wir möchten die Messwerte jedoch mit XBASE++ (Objektorientierte Datenbankprogrammiersprache von der Fa. Alaska) lesen.
(Das komplette Messwertverwaltungsprogramm ist bereits in XBase++ geschrieben)

Wir wollten dies mit der QuantumX API (COM) lösen.

In der Vergangenheit haben wir schon öfters Activex Componenten mit erfolg in Xbase++ eingebunden. Jedoch die QuantumX Komponenten
Z.B: ScanForDevices bzw. Connect erzeugen Laufzeitfehler.

Dieses Problem habe ich ausführlich im Xbase Forum behandelt. Ein User tippt, das QuantumX nicht auf iDispatch aufgebaut ist.
siehe Forenbeitrag ==> http://www.xbaseforum.de/viewtopic.php?f=28&t=4274

Ist QuantumX API (COM) auf iDispatch aufgebaut ?
Was würden Sie mir empfehlen wie ich auf die Daten zugreifen soll ?


==> Antwort Fa. HBM

die Hilfe der High-Level API referenziert eher auf die Verwendung in der .NET Laufzeitumgebung.
Die API unterstützt aber auch die COM-Technologie. Datentypen können aber im Einzelfall abweichen, so z.B. UINT64 für die UUID (das ist die MAC-Adresse des Geräts). Typischerweise ist UINT64 bei COM ein String.

Haben Sie sich die Typendeklaration unseres COM-Beispiels unter VB angesehen?

Leider wissen wir nicht wie man ein Array vom Typ ScanResults in XBase++ anlegt.

Ich hoffe, wir konnten Ihnen weiterhelfen.



mfg.

mkersch
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Variablenstruktur für ActivX aufruf

Beitrag von brandelh »

Hi,

ich kann mich nur wiederholen, du musst entweder mit BAP (l2bin(), f2bin()) einen String erzeugen,
der dem Aufbau dieser Struktur entspricht und so oft verketten wie du Array-Elemente brauchst
(ein Xbase++ Array ist anders aufgebaut als in VB) oder du nutzt die ot4xb von Pablo zur Definition
der Struktur und verkettest diese.

Es müsste auch möglich sein ein VB6 Programm zu erstellen, das die .NET Messgeräte bedient
und per COM Server mit eigenen Schnittstellen die Daten an dein Xbase++ Programm weitergibt.

Falls du eine Subscription mit Support hast, kannst du natürlich auch bei Alaska nach Unterstützung fragen.
Gruß
Hubert
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Re: Variablenstruktur für ActivX aufruf

Beitrag von mkersch »

Vielen Dank für Eure Bemühungen

"Letzer Versuch"

Seit 1990 (Clipper Sommer 87) beschäftige ich mich mit dem Xbase Dialekt. Wir estellen Prüfprogramme.
Leider ist dies nicht mein Hauptbetätigungsfeld (Maschinensteuerungen Siemens S7, Roboter Hirata usw.)

Da ich die Internas von Xbase++ nicht gut kenne, wende ich mich ein letztes mal an Euch mit der Bitte um Unterstüzung.

Code: Alles auswählen

Dim QXSystem As QXSystem_
Dim QXSimpleDAQ As QXSimpleDAQ_

Dim MyDevice As Device
Dim MyScanResults() As ScanResult

' Geräte scannen
MyScanResults = QXSystem.ScanForQXDevices
' Gerät connecten
result = QXSystem.Connect(MyScanResults(0).IpAddress, MyScanResults(0).Port)

Wie kann ich ScanResult mit ot4xb von Pablo abbilden ?

public ScanResult(UInt64 UUID, string Name, string ModuleType, string IPAddress, string SubNetmask, int Port);


Array[1].UUID // für ersten Atapter
Array[1].Name
Array[1].ModuleType
Array[1].IPAddress
Array[1].SubNetmask
Array[1].Port

Array[2]. UUID // für zweiten Atapter
usw.

Meine Versuche:
BEGIN STRUCTURE mScanResult
MEMBER DWORD64 UUID
MEMBER LONG Name
MEMBER LPSTR ModuleType
MEMBER LPSTR IPAdress
MEMBER LPSTR SubNetMask
MEMBER INT32 Port
END STRUCTURE

local oScan := {mScanResult():New()}
oScan := oQXSystem:ScanForQXDevices()

mfg.

mkersch
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Variablenstruktur für ActivX aufruf

Beitrag von brandelh »

mkersch hat geschrieben:Vielen Dank für Eure Bemühungen
"Letzer Versuch"
ist das jetzt eine Drohung ;-)

Im Ernst, die Ansteuerung von ActiveX Objekten zählt nicht zu den einfachsten Dingen.
Warum willst du genau diese Aufgabe mit Xbase++ machen, wenn du dich da nicht gut auskennst ?
Wäre es nicht sinnvoller die Steuerungsdaten per VB Programm (mit Unterstützung des Herstellers) zu ermitteln und diese dann z.B. als Datei oder TCPIP an das Auswertungsprogramm zu übermitteln ?

Wenn es Xbase++ sein soll, wäre ein outsourcen sinnvoll.
Gerade die Ansteuerung von "exotischer" Hardware (zumindest im Xbase++ Umfeld) setzt tiefgreifende
Kenntnisse von Protokollen und Speicherbelegung voraus.
Offensichtlich hat sich hier noch niemand mit genau dieser Hardware beschäftigt.
Ich kann dafür (ohne irgendeinen persönlichen Nutzen) Pablo Botella empfehlen. Er hat nicht nur die Bibliothek ot4xb geschrieben, er lebt von solchen schwierigen Aufgabenstellungen und weiß wovon er spricht.

Ich versuche mich mal an der Strukturbeschreibung, mit VB habe ich nichts am Hut, aber...

Code: Alles auswählen

In VB ==> MyScanResult(1).UUID // UINT64
MyScanResult(1).Name // String
MyScanResult(1).Module.Typ // String
MyScanResult(1).IPAdresse // String
MyScanResult(1).Port // INT
ist vom Typ her schon in mehreren Punkten etwas anderes als ...
mkersch hat geschrieben:

Code: Alles auswählen

BEGIN STRUCTURE mScanResult
   MEMBER DWORD64 UUID
   MEMBER LONG Name
   MEMBER LPSTR ModuleType
   MEMBER LPSTR IPAdress
   MEMBER LPSTR SubNetMask
   MEMBER INT32 Port
END STRUCTURE
ich käme bei der Strukturbeschreibung auf ...

Code: Alles auswählen

BEGIN STRUCTURE mScanResult
   MEMBER DWORD64    UUID           //  ok
   MEMBER LPSTR         Name          //  laut VB String ? SZSTR ? DYNSZ ?
   MEMBER ???    Module.Type         //  laut BV Module.Typ -> 2 Typen !!!  
   MEMBER LPSTR IPAdress             //  laut VB String ? SZSTR ? DYNSZ ?
   MEMBER LPSTR SubNetMask        // ???? fehlt in der VB Beschreibung
   MEMBER ???    Port                    // DWORD oder WORD oder LONG ???
END STRUCTURE  
und habe schon 2 Unbekannte ... ohne die richtige Dokumentation und einige Stunden lesen ist da nichts zu machen.
INT32 ist laut ot4xb Doku ein Synonym für DWORD, d.h. andere könnten es so benennen.
Hier muss man DWORD (32 bit unsigned) oder WORD (16 bit unsigned) oder LONG (32 bit signed) etc. benutzen.
Was genau, muss aus der Doku hervorgehen. Es müsste eine Art von INCLUDE Datei geben die diese Strukturen enthält, oder aber diese werden direkt aus dem ActiveX geladen, das weiß ich nicht.

Zum Schluss einige Beispiele wie solches bei meinem PowerBasic aussieht, vielleicht hilft das beim Finden:

Code: Alles auswählen

TYPE FINDREPLACE
    lStructSize      AS DWORD
    hWndOwner        AS DWORD
    hInstance        AS DWORD
    Flags            AS DWORD
    lpstrFindWhat    AS ASCIIZ PTR
    lpstrReplaceWith AS ASCIIZ PTR
    wFindWhatLen     AS WORD
    wReplaceWithLen  AS WORD
    lCustData        AS LONG
    lpfnHook         AS DWORD
    lpTemplateName   AS ASCIIZ PTR
END TYPE

%FR_DOWN                        = &H00000001&
%FR_WHOLEWORD                   = &H00000002&
%FR_MATCHCASE                   = &H00000004&
%FR_FINDNEXT                    = &H00000008&
%FR_REPLACE                     = &H00000010&
%FR_REPLACEALL                  = &H00000020&
mit diesen Angaben kann man den Typ sauber erkennen und auch ein BEGIN STRUCTURE umsetzen.

Da fällt mir ein, es gibt doch für ActiveX einen COM Browser ...

Mit dem Programm im XPPw32\bin\Tlb2Ch.exe kann man die Eigenschaften von ActiveX COM Schnittstellen abfragen und eine CH Datei erstellen lassen. Vielleicht hilf das ?
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Re: Variablenstruktur für ActivX aufruf

Beitrag von mkersch »

Hallo Forenmitglieder,

mein letzter Artikel war keine "Drohung"

Nochmals vielen Dank für Eure Bemühungen.

Mein Projekt werde ich jetzt mit einer Art "Low-Level API von HBM" und ot4xb weiterverfolgen.

Erste Erfolge sind sichtbar !


mfg.

mkersch
Antworten