PLServer von NordicId verwenden

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

PLServer von NordicId verwenden

Beitrag 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.
Gruß Klaus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PLServer von NordicId verwenden

Beitrag 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.
gruss by OHR
Jimmy
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: PLServer von NordicId verwenden

Beitrag 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.
Gruß Klaus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PLServer von NordicId verwenden

Beitrag 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.
gruss by OHR
Jimmy
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: PLServer von NordicId verwenden

Beitrag 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.
Gruß Klaus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PLServer von NordicId verwenden

Beitrag 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/
gruss by OHR
Jimmy
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: PLServer von NordicId verwenden

Beitrag 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?
Gruß Klaus
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: PLServer von NordicId verwenden

Beitrag von Klaus Schuster »

Die Dateiendung .pas war nicht erlaubt. Nun als .txt.
Dateianhänge
PLSERVERLib_TLB_7.0.0.txt
(40.04 KiB) 434-mal heruntergeladen
Gruß Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: PLServer von NordicId verwenden

Beitrag 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 ;-)
Gruß
Hubert
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: PLServer von NordicId verwenden

Beitrag von Klaus Schuster »

wie wahr, wie wahr. Beim nächsten Mal...
Gruß Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: PLServer von NordicId verwenden

Beitrag 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.
Gruß
Hubert
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: PLServer von NordicId verwenden

Beitrag 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?
Gruß Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: PLServer von NordicId verwenden

Beitrag 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.
Gruß
Hubert
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: PLServer von NordicId verwenden

Beitrag 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
Gruß Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: PLServer von NordicId verwenden

Beitrag von brandelh »

sorry :?:
Gruß
Hubert
Udo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 46
Registriert: Do, 18. Okt 2007 15:37

Re: PLServer von NordicId verwenden

Beitrag 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
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: PLServer von NordicId verwenden

Beitrag 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
Gruß Klaus
Udo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 46
Registriert: Do, 18. Okt 2007 15:37

Re: PLServer von NordicId verwenden

Beitrag 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



Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: PLServer von NordicId verwenden

Beitrag von Klaus Schuster »

Hallo Udo,

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