+1 800 256 3608 (toll-free in North America) or +49 7531 90 60 10| service@combit.com

List & Label DLLs nach Gebrauch entladen. Wie geht das?


(Nico Prenzel) #1

Hallo Forumsgemeinde,

ich nutze List & Label 22 zum Druck aus Lotus Notes heraus. Dazu rufe ichsämtliche Druckaufträge mit folgendem Codekonstrukt auf:

	Dim m_lngReportID As Long
	Dim PrintBoxFlag As Long
	Dim strPrintOutputChoices As String
	Dim ReportFilename As String
	Dim lngPrintOutputSelection As Long
	
	strPrintOutputChoices ="PRN;PRV" 
	lngPrintOutputSelection = LL_PRINT_EXPORT
	
	m_lngReportID = LLJobOpen(CMBTLANG_GERMAN) ' opens job
	
	ReportFilename = "C:\Testberichte\Berichtsname.lst"
	
	PrintBoxFlag = LLPrintStart(m_lngReportID, LL_PROJECT_LIST,ReportFilename, lngPrintOutputSelection,0)
	
	LlPrint m_lngReportID
	
	LlPrintEnd m_lngReportID,0
	
	LLjobclose m_lngReportID

Nun durfte ich leider feststellen, dass die List & Label DLL auch nach dem kompletten Durchlauf des Codes nicht mehr entladen werden (ist wohl einem Cacheing geschuldet). Siehe dazu den Dateianhang…
Diese dauerhaft geladenen DLL’s verhinden jedoch eine mögliche Aktualisierung der DLL’s mit z.B. neuen Versionen aus einem zukünftigen Servicepack.
Gibt es eine Möglichkeit die DLL’s seitens List & Label zu entladen?


(Oliver Hambrecht) #2

Hallo,

also LlJobOpen() und LlJobClose() sind bereits die zentralen Routinen, um LL zu verwenden - sich also anzumelden und auch wieder abzumelden.
Nur, damit man diese APIs überhaupt aufrufen kann, muss Notes doch “irgendwie” zunächst diese DLL-Funktionen anmelden, indem es die DLLs in den Speicher lädt - also sowas wie ::LoadLibrary() oder sowas.
Wie werden denn die APIs von LL in Notes bereit gestellt? Gibt es hierzu vielleicht einen zentrale Stelle im Notes oder wird eine Deklarationsdatei verwendet? Gibt es vielleicht noch eine andere Stelle, in der ein sogenanntes Schutzobjekt (siehe ggf. auch https://www.combit.net/kb/KBTD000795) von LL erstellt wird und erst beim Beenden von Notes freigegeben wird?

Vielleicht hilft das bereits weiter?

Grüße


(Nico Prenzel) #3

Hallo,

danke für deine Antwort.
Die DLL’s werden mithilfe der in der Deklarationsdatei cmLL22.lss beschriebenen API Aufrufe verwendet. Diese Datei wird von combit mitgeliefert. Ein Auszug daraus für die verwendeten Funktionen:

' LotusScript constants and function definitions for LL22.DLL
'  (c) combit GmbH
'  [build of 2017-07-06 09:07:39]

...
Declare Function  LlJobOpen                        Lib "CMLL22.DLL" Alias "LlJobOpen" (ByVal nLanguage As Long) As Long
Declare Sub       LlJobClose                       Lib "CMLL22.DLL" Alias "LlJobClose" (ByVal hLlJob As Long)
...

(Oliver Hambrecht) #4

Hallo,

ich kenne mich nun leider in Notes nicht wirklich aus. Aber in der Regel müssen die DLLs von LL zunächst geladen werden, bevor die APIs aus dessen Deklarationsdatei aufgerufen werden können. Daher müsste es doch “irgendwo” im Notes oder im Script eine Stelle geben, in der man sagt, dass die DLLs von LL geladen, verwendet oder referenziert werden sollen?! Zumindest kenne ich das so aus bspw. C++ Aplikationen heraus. In C++ verwendet man dann oft ::LoadLibrary() dafür oder aber man linkt direkt die LIB-Datei von LL. Vielleicht muss man da nochmal suchen… Sorry.

Grüße


(combit Support - Christian Rauchfuß) #5

Hallo Herr Prenzel,

vielen Dank für Ihren Beitrag.

Die List & Label DLL selbst muss dynamisch geladen werden und darf nicht “statically linked” werden. In beispielsweise C++ gibt es hierfür eine spezielles Headerfile, das das erledigt (*.hx). In anderen Programmiersprachen muss dies jedoch selbst programmiert werden, d.h. nach LoadLibrary muss mit GetProcAddress() die LL API Funktionen dynamisch geholt werden. Genau das macht die *.hx-Datei über eine Wrapper-Funktion voll-automatisch. Herr Hambrecht hat dies bereits angedeutet.

Mit freundlichen Grüßen

Christian Rauchfuß
Technischer Support
combit GmbH


(Nico Prenzel) #6

Hallo,

vielen Dank für die Anworten.
Leider gibt es in Lotus Notes kein Möglichkeit das Laden der Bibliotheken zu beeinflussen.
In unserer vorherig, eingesetzen List & Label Version 8 wurden die Bibliotheken nach jedem Vorschau/Druckvorgang auch wieder korrekt entladen. Das habe ich soeben nochmals getestet.

Viele Grüße

Nico Prenzel


(combit Support - Christian Rauchfuß) #7

Hallo Herr Prenzel,

dass Lotus Notes hier wohl keine Möglichkeiten bietet, die DLL und die von ihr exportierten Methoden dynamisch zu binden, ist sehr ärgerlich. Jedoch können wir dies leider nicht beeinflussen.

Dennoch noch eine kleine Anmerkung: die beiden Aussagen widersprechen sich technisch “eigentlich”. Auch List & Label 8 wird/würde/wurde von Lotus Notes statisch gebunden werden (der Mechanismus ist ja nicht von LL, sondern von Lotus Notes) und auch eine alte Version 8 könnte sich “nicht selbst entladen”. Wir sprechen hier jetzt von der List & Label “Kern-DLL”. Die Vorschau-Anzeige kann früher durch die LL “Kern-DLL” u.U. tatsächlich dynamisch eingebunden (und dadurch von der DLL andere DLLs dynamisch nachgeladen und wieder entladen) worden sein, aber die LL “Kern-DLL” würde ja durch Lotus Notes immer auf ein und dieselbe Weise geladen und (nicht mehr) entladen. Das kann die DLL für sich selbst nicht steuern.

Mit freundlichen Grüßen

Christian Rauchfuß
Technischer Support
combit GmbH


(Nico Prenzel) #8

Hallo Herr Rauchfuß

vielen Dank für Ihre Antwort.

Leider kann kein Einfluß auf die Ladeart der DLL’s über Lotus Notes genommen werden.
Ich habe mir daher nochmals die Implementation von LL8 angesehen. Mit dieser Altversion werden bei Aufruf des Drucks die folgenden DLL’s geladen (siehe Screenshot) und nach dem Druck auch wieder korrekt entladen.

Mittlerweile haben wir auch schon den 1. Folgefehler bzgl. dieser Problematik seit Umstellung auf LL22 gemeldet bekommen. Problematisch wird es, wenn an den Druckereinstellungen seitens Windows etwas geändert wird (z.B. Drucker nicht mehr vorhanden) und dann mit LL22 auf einem anderen Gerät gedruckt werden soll. Dann meldet LL22 “Kein Drucker gefunden” und der LlPrintOptionsDialog verweigert das Öffnen und ein anderer Drucker lässt sich somit nicht auswählen. Der Druckvorgang scheiter somit!

Wie bekommen wir das Problem denn gelöst?


(combit Support - Christian Rauchfuß) #9

Hallo Herr Prenzel,

ein frohes neues Jahr.

Haben Sie die Möglichkeit über den ProcessExplorer von SysInternals (Process Explorer) zu prüfen, welcher Prozess die Dateien noch lockt?

Besteht evtl. eine Möglichkeit den LotusScript-Support mit ins Boot zu holen?

Mit freundlichen Grüßen

Christian Rauchfuß
Technischer Support
combit GmbH