Seite 1 von 1

PLServer von NordicId verwenden

Verfasst: Mi, 18. Jun 2014 10:48
von Klaus Schuster
Hallo,

hat es jemand geschafft Nachrichten des PLServers (OCX) zu verarbeiten?

Ich habe diesen mit

oPLServer := GetObject( , 'PLSERVER.PLServerCtrl.1' )
und
oPLServer:dynamicCast( ActiveXObject() )

erfolgreich in ein Objekt der Klasse ActiveXObject überführt, schaffe es aber nicht, eingehende Nachrichten zu empfangen.

Re: PLServer von NordicId verwenden

Verfasst: Mi, 18. Jun 2014 13:18
von AUGE_OHR
Klaus Schuster hat geschrieben:erfolgreich in ein Objekt der Klasse ActiveXObject überführt, schaffe es aber nicht, eingehende Nachrichten zu empfangen.
wenn du Events empfangen willst solltest du statt GetObject / DynamicCast() es mal mit XbpActiveXControl() versuchen und mit o:subscribeEvent() ein Ereignis abonnieren. Da hierfür meistens Konstanten verwendet werden solltest du mit

Code: Alles auswählen

Tlb2Ch.exe CLSID

CLSID = 'PLSERVER.PLServerCtrl.1'
versuchen einen Header zu erstellen und den in eine *.CH umleiten.

Re: PLServer von NordicId verwenden

Verfasst: Mi, 18. Jun 2014 13:43
von Klaus Schuster
Hallo Jimmy,

Danke für Deine Antwort!

GetObject() habe ich verwandt, da in der Hilfe von Alaska unter diesem Beispiel die Behandlung von Nachrichten erwähnt wird. Kann ich analog zu ActiveXObject() auch XbpActiveXControl() verwenden?

::ActiveXControl1 := XbpActiveXControl():new( ::drawingArea, , {48,96}, {924,564} )
::ActiveXControl1:CLSID := '{244758C6-A002-11D2-B82B-938DAECFCE37}'

Das Control stellt eine Fenster zur Verfügung.

Re: PLServer von NordicId verwenden

Verfasst: Mi, 18. Jun 2014 14:15
von AUGE_OHR
Klaus Schuster hat geschrieben:Das Control stellt eine Fenster zur Verfügung.
man benötigt meistens ein "Fenster" an das man einen Event schicken kann.
wichtig ist nun das man mit o:subscribeEvent() ein Ereignis abonniert denn nur dann kannst du es auswerten und darauf reagieren.

Re: PLServer von NordicId verwenden

Verfasst: Fr, 20. Jun 2014 9:08
von Klaus Schuster
Hallo Jimmy,

vorab Danke. Am Dienstag bekomme ich ein Gerät zum Testen. Mal sehen, ob es mir gelingt, die Nachrichten erhalten, verarbeiten und beantworten zu können.

Re: PLServer von NordicId verwenden

Verfasst: Fr, 20. Jun 2014 14:26
von AUGE_OHR
hi,

hoffe das du dann auch eine Dokumentation über das *.OCX bekommst.
wenn nicht dann sie dir mal "HTML Help COM Assistant" an
http://www.devcomponents.com/

Re: PLServer von NordicId verwenden

Verfasst: Do, 31. Jul 2014 11:06
von Klaus Schuster
Hallo Jimmy,

folgender Code führt zu einem Absturz mit dem Exit-Code -1073741819, sobald eine Nachricht an den PLServer gesendet wird (ein Barcode eingescannt wurde):

Code: Alles auswählen

#include "Appevent.ch"
#include "Common.ch"
#include "Font.ch"
#include "Gra.ch"
#include "Xbp.ch"

#pragma library( "ascom10.lib" )

CLASS _NewForm FROM XbpDialog
   EXPORTED:
      VAR editControls

      * Enthaltene Kontrollelemente
      VAR ActiveXControl1

      METHOD init
      METHOD create
ENDCLASS

******************************************************************************
* Formular initialisieren
******************************************************************************
METHOD _NewForm:init( oParent, oOwner, aPos, aSize, aPP, lVisible )

   DEFAULT oParent  TO AppDesktop(), ;
           aPos     TO {474,141}, ;
           lVisible TO .F.

   DEFAULT aPP TO {}
   AAdd ( aPP, { XBP_PP_COMPOUNDNAME, "8.Arial" } )

   IF Empty(aSize) == .T.
      IF IsMemberVar(self,"ClientSize") == .T.
         aSize := {0,0}
      ELSE
         aSize := {1024,768}
      ENDIF
   ENDIF

   ::XbpDialog:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
   IF aSize[1] == 0 .AND. aSize[2] == 0
      ::XbpDialog:ClientSize := {1016,740}
   ENDIF
   ::XbpDialog:taskList := .T.
   ::XbpDialog:title := "Neues Formular"

   ::editControls := {}

   ::ActiveXControl1 := XbpActiveXControl():new( ::drawingArea, , {48,96}, {924,564} )
   ::ActiveXControl1:CLSID := '{244758C6-A002-11D2-B82B-938DAECFCE37}'

   ::ActiveXControl1:subscribeEvent( 1, {|| MsgBox( 'Gut so' )})

RETURN self


******************************************************************************
* Systemresourcen anfordern
******************************************************************************
METHOD _NewForm:create( oParent, oOwner, aPos, aSize, aPP, lVisible )

   ::XbpDialog:create( oParent, oOwner, aPos, aSize, aPP, lVisible )

   ::ActiveXControl1:create()

RETURN self
Von einem Kollegen, der den PLServer schon häufig in Delphi eingebunden hat, habe ich eine Datei mit Dispatch-Ids bekommen.
Für den Fall, dass Du die gesamte Datei benötigst, ist diese angehängt
Der Abschnitt mit der Methode 'DataArrived' deren Ereignisse behandelt werden sollen, lautet
  • // *********************************************************************//
    // DispIntf: _DPLServerEvents
    // Flags: (4096) Dispatchable
    // GUID: {785739C4-A288-11D2-B82B-8D8A650ADC32}
    // *********************************************************************//
    _DPLServerEvents = dispinterface
    ['{785739C4-A288-11D2-B82B-8D8A650ADC32}']
    procedure DataArrived(id: Integer; frameid: Smallint); dispid 1;
Erstaunlich ist, dass es im PLServer noch weitere Methoden mit derselben Dispatch-Id 1 gibt.

Hast Du eine Idee?

Re: PLServer von NordicId verwenden

Verfasst: Do, 31. Jul 2014 11:11
von Klaus Schuster
Die Dateiendung .pas war nicht erlaubt. Nun als .txt.

Re: PLServer von NordicId verwenden

Verfasst: Do, 31. Jul 2014 11:30
von brandelh
Falls eine Dateiendung nicht erlaubt ist, kann man entweder ZIPpen oder .TXT anhängen, z.B. x.PAS.TXT ... so bleibt immer noch sichtbar was für ein Format gedacht war ;-)

Re: PLServer von NordicId verwenden

Verfasst: Do, 31. Jul 2014 11:36
von Klaus Schuster
wie wahr, wie wahr. Beim nächsten Mal...

Re: PLServer von NordicId verwenden

Verfasst: Do, 31. Jul 2014 12:36
von brandelh
du solltest auf jeden fall mit dem von jimmy erwähnten tool eine CH Datei erstellen, so wie es in den Beispielen von Alaska zu Excel etc. auch erstellt wurde.
In dieser kannst du nachsehen was wie benötigt und vorhanden ist, PAS Code verstehen hier eher weniger und die Unterschiede insbesondere bei den Daten sind doch erheblich.

Ich vermute du musst events verarbeiten, die vom Server kommen, das geht entweder nur über den CALLBACK Compiler von Pablo oder
direkt mit dem umgewandelten ComObjekt, wie du es erwähnt hast. Ich kenne mich damit nicht so aus.

Re: PLServer von NordicId verwenden

Verfasst: Do, 31. Jul 2014 14:24
von Klaus Schuster
Hallo Hubert,

Danke für Deine Antwort. Kannst Du mir bei dem Tool Tlb2Ch helfen?!

Wenn ich 'Tlb2Ch 244758C6-A002-11D2-B82B-938DAECFCE37' auf der Commandozeile eingebe und bestätige erhalte ich die Meldung 'Ungültige Klassenzeichenfolge'. Woran kann das liegen?

Re: PLServer von NordicId verwenden

Verfasst: Do, 31. Jul 2014 14:49
von brandelh
ich selbst habe das noch nicht gemacht, da ich nur DLL oder die fertigen Excel.ch / Word.ch nutze.
Möglicherweise muss man die GUID einschließen, in deinem Beispiel sieht es so aus, als ob {} dafür genutzt werden:

Tlb2Ch {244758C6-A002-11D2-B82B-938DAECFCE37}

da ich diese aber nicht habe bekommte ich eine andere Fehlermeldung.
AUGE_OHR oder TOM nutzen das Programm sicher häufiger.
Jimmy hat auch einen COM Browser erwähnt, damit kann man auch an die Infos kommen.

Re: PLServer von NordicId verwenden

Verfasst: Do, 31. Jul 2014 14:57
von Klaus Schuster
Guter Mann, sowohl die von Dir vorgeschlagene Lösung als auch
Tlb2Ch PLSERVER.PLSERVERCTRL.1
haben eine Headerdatei erstellt; allerdings weitgehend leer. Sie enthält nur

Code: Alles auswählen

////////////////////////////////////////////////////////////////////////////////
//
// Automatisch generiertes Header File
//
// Programm ID:            PLSERVER.PLSERVERCTRL.1
//
// Erstellungs Datum:      31.07.2014
//
// Erstellungs Werkzeug:   Tlb2Ch.exe
//
//                         Copyright (c) Alaska Software. Alle Rechte vorbehalten.
//
////////////////////////////////////////////////////////////////////////////////

#ifndef _PLSERVER_PLSERVERCTRL_1_HAEDER_DAEMON

#define _PLSERVER_PLSERVERCTRL_1_HAEDER_DAEMON
#endif //_PLSERVER_PLSERVERCTRL_1_HAEDER_DAEMON

Re: PLServer von NordicId verwenden

Verfasst: Do, 31. Jul 2014 15:04
von brandelh
sorry :?:

Re: PLServer von NordicId verwenden

Verfasst: Do, 21. Aug 2014 9:45
von Udo
Hallo Klaus,

ist das Thema noch aktuell ?
Wir setzen den PlServer von NordicId in Verbindung mit Xbase ein. Ist ein paar Jahre her, dass wir das geschrieben haben.
Läuft, wenn es einmal steht, völlig stabil und wartungsfrei. Ich kann gerne nachsehen, wie es geht, wenn du noch Probleme hast.

Gruß
Udo

Re: PLServer von NordicId verwenden

Verfasst: Do, 21. Aug 2014 12:57
von Klaus Schuster
Hallo Udo,

das Thema ist noch aktuell! Es würde mich sehr freuen, wenn Du mir ein wenig Code geben, so dass die Herangehensweise klar wird.

Herzlich Dank im voraus
Klaus

Re: PLServer von NordicId verwenden

Verfasst: Fr, 22. Aug 2014 11:30
von Udo
Hallo Klaus,

da (wie immer) die Zeit knapp ist, hier nur kurz skizziert, wie wir den Einstieg gemacht haben (s.u.).
Wichtig!
Ich kann mich erinnern, dass die Xbase ActiveX Schnittstelle mit neueren PLServer.ocx Versionen nicht mehr funktionierte!
Wir benutzen den Stand 4.7.0 vom 20.12.2004. Da es damit nie Probleme gab, haben wir das Thema nicht weiter verfolgt.
Möglich, dass sich das mit der aktuellen Xbase Version auch geändert hat.

Für die Programmierung brauchst du zwingend das Developer Guide; gibt es als PDF bei NordicId.
Hier findest du alles was du zur Programmierung brauchst (z.B. ConnectToSerialServer() usw )
Es ist ein ganzes Stück Arbeit sich da einzudenken, aber dann geht's.

Glück Auf!
Udo


Code: Alles auswählen

 
* --------------------------------  PLSERVER -------------------------
#define PEV_DATAARRIVED 1
#define PEV_WHAT 4
* --------------------------------------------------------------------
...

* ---------------- Active X  PLServer Componente ---------------
  oAx := XbpActiveXControl():new( oDa, , {10, aSize[2]-140}, {340,100} )
  oAx:CLSID := "{244758C6-A002-11D2-B82B-938DAECFCE37}"
  oAx:TabStop := .T.
  oAx:create()
  oAx:subscribeEvent(PEV_DATAARRIVED,{|p1,p2|DataArrived(p1,p2) })
  oAx:subscribeEvent(PEV_WHAT       ,{|p1,p2|WhatArrived(p1,p2) })
...

  Verbinde(@oAx, @oInfo)
  lExit := .F.
  DO WHILE !lExit
    nEvent := AppEvent( @mp1, @mp2, @oXbp )
    oXbp:handleEvent( nEvent, mp1, mp2 )
    IF nEvent == xbeP_Close
      lExit := .T.
    ENDIF
  ENDDO
  Entbinde(@oAx, @oInfo)



FUNCTION verbinde(oAX,oInfo)
   * ---- konkret  mit 2 Empf„ngern -------------

   LOCAL cText := ""
   MEMVAR cIPadr1,cIPadr2,cPort1,cPort2

   /*  für Picco Nachfolger mit WinMobile und Emulator über WLAN
   * oAx:StartServer(2000)
   */

   IF !empty(cIPadr1)
     nConnId := oAx:ConnectToSerialServer(cIpAdr1,val(cPort1))
   ENDIF
   IF nConnId = -1
    *msgbox("Kein Kontakt")
     cText += "Kein Kontakt zu "+cIpAdr1
   ELSE
    *msgbox("Verbunden!")
    cText += "Verbunden!"+str(nConnId)
   ENDIF

   IF !empty(cIPadr2)
     nConnId := oAx:ConnectToSerialServer(cIpAdr2,val(cPort2))
   ENDIF
   IF nConnId = -1
    *msgbox("Kein Kontakt")
     cText += " Kein Kontakt zu "+cIpAdr2
   ELSE
    *msgbox("Verbunden!")
    cText += " Verbunden!"+str(nConnId)
   ENDIF

   oInfo:setcaption(cText)
RETURN (cText)

FUNCTION entbinde(oAX,oInfo)
   oAx:DisconnectSerialServer(nConnId)
   oInfo:setcaption(":")
RETURN NIL




Re: PLServer von NordicId verwenden

Verfasst: Di, 26. Aug 2014 9:18
von Klaus Schuster
Hallo Udo,

Danke für Deine Arbeit. Sobald ich etwas Neues weiß, melde ich mich.