Dll Funktion wird nicht mehr gefunden [ERLEDIGT]

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Dll Funktion wird nicht mehr gefunden [ERLEDIGT]

Beitrag von Magic »

Hallo,

bin gerade am verzweifeln :banghead: :banghead: :banghead:

Seit Jahren benutze ich folgende Funktion:

Code: Alles auswählen

DLLFUNCTION wapiGetDefaultPrinter( @pPrinter, @pwdBufferSize ) ;
            USING OSAPI ;
            FROM WINSPOOL.DRV
Jetzt habe ich ein Projekt neu kompiliert und bekomme einen Laufzeitfehler, sobald diese Funktion aufgerufen wird
oError:args :
-> VALTYPE: C VALUE: WINSPOOL.DRV
-> VALTYPE: N VALUE: 32
-> VALTYPE: C VALUE: wapiGetDefaultPrinter
oError:canDefault : J
oError:canRetry : N
oError:canSubstitute: N
oError:cargo : NIL
oError:description : Unbekannte Funktion
oError:filename :
oError:genCode : 21
oError:operation : dllPrepareCall
oError:osCode : 0
oError:severity : 2
oError:subCode : 2002
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
Das Kompilieren klappt ohne Probleme und auch die letze Version meines Programms läuft ohne zu meckern.

Woran kann das liegen :?: Ich bin für jeden Vorschlag dankbar :!:
Zuletzt geändert von Magic am Fr, 30. Nov 2012 8:47, insgesamt 1-mal geändert.
Gruß,
Magic
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Dll Funktion wird nicht mehr gefunden

Beitrag von Rolf Ramacher »

Ich habe mich mit DLL-Calls noch nicht beschäftigt. Ist es evtl. ein anderes OS anstatt wie vorher ??
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Dll Funktion wird nicht mehr gefunden

Beitrag von Magic »

Rolf Ramacher hat geschrieben:Ich habe mich mit DLL-Calls noch nicht beschäftigt. Ist es evtl. ein anderes OS anstatt wie vorher ??
Exakt derselbe Rechner. Und auch die letzte Version läuft problemlos.
Gruß,
Magic
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Dll Funktion wird nicht mehr gefunden

Beitrag von Martin Altmann »

Und die letzte (also laufende) Version liegt im selben Verzeichnis (und hat auch das selbe "Start in:"-Verzeichnis in der Verknüpfung hinterlegt), wie die neue (also nicht funktionierende) Version?

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
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Dll Funktion wird nicht mehr gefunden

Beitrag von Magic »

Nein, sind zwei getrennte Verzeichnisse.
Testweise habe ich sie in eins gepackt, mit dem gleichen Misserfolg.
Gruß,
Magic
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Dll Funktion wird nicht mehr gefunden

Beitrag von Martin Altmann »

Und sind die DLL-Dateien in den beiden Verzeichnissen identisch?
: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
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Dll Funktion wird nicht mehr gefunden

Beitrag von Magic »

Martin Altmann hat geschrieben:Und sind die DLL-Dateien in den beiden Verzeichnissen identisch?
:?:
Nö, keine Dlls drin (in beiden Verzeichnissen). Die Funktion die angeblich nicht bekannt ist, ist 'ne Standard Funktion aus/von Windows API.
Gruß,
Magic
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Dll Funktion wird nicht mehr gefunden

Beitrag von Martin Altmann »

Darum frage ich ja!
Die Standardfunktion ist ja ebenfalls in einer DLL - und wenn in dem anderen Verzeichnis eine liegen würde, würde diese genommen werden (statt der in %SYSTEM%).
: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.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Dll Funktion wird nicht mehr gefunden

Beitrag von georg »

Hallo,


ich habe zwar keine Ahnung von wapiGetDefaultPrinter, aber eine Google Suche gibt mir nur Deinen Beitrag als Ergebnis, sowie etliche Treffen bezüglich Linux ...

Bist Du Dir sicher, dass der API-Name korrekt geschrieben ist?

Laut MSDN müsste es GetDefaultPrinter sein:

http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Oder hast Du in dem anderen Programme ein TRANSLATE Direktive, die wapiGetDefaultPrinter übersetzt?
Zuletzt geändert von georg am Do, 29. Nov 2012 15:02, insgesamt 1-mal geändert.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Dll Funktion wird nicht mehr gefunden

Beitrag von Magic »

Martin Altmann hat geschrieben:Darum frage ich ja!
Die Standardfunktion ist ja ebenfalls in einer DLL - und wenn in dem anderen Verzeichnis eine liegen würde, würde diese genommen werden (statt der in %SYSTEM%).
Mensch Martin, dann frag doch nicht von hinten rum :wink:

Irgendetwas muss ich mal gedreht haben, ohne mich jetzt daran erinnern zu können.
Denn sobald er Compiler durch ist, funktioniert es nicht mehr.
Misst, sollte nur eine kleiner Eingriff sein … bin aber jetzt fast ein Tag schon dran. :roll:
Gruß,
Magic
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Dll Funktion wird nicht mehr gefunden

Beitrag von Magic »

Das Kompilieren scheint sauber zu laufen, denn ich bekomme keine Fehler / Warnungen (habe alle Schalter an) und zum Schluß ein ... create successfully.
Das einzige, was mich etwas stutzig macht ist folgender Eintrag:
[Hint]: Dump public and/or external symbols.
Keine Ahnung was es mir sagen soll, es ist mir bisher aber noch nie aufgefallen.
Gruß,
Magic
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Dll Funktion wird nicht mehr gefunden

Beitrag von georg »

Hallo, Magic -


der Compiler übernimmt den DLL-Aufruf ohne Prüfung, daher wirst Du von dort keinen Fehler bekommen, selbst wenn Du "diesefunktiongibtesbestimmtueberhauptnicht" verwenden würdest.

Die Prüfung geschieht zur Laufzeit und endet in dem von Dir genannten Fehler.

Nochmals meine Frage:

Stimmt der Name? Oder hattest Du bei dem alten Programme eine #TRANSLATE Direktive?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
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: Dll Funktion wird nicht mehr gefunden

Beitrag von brandelh »

Bei fremd DLLs habe ich das schon gehabt, aber SYSTEM DLLs ?
Und alt läuft noch ... :?:

Aber für den DEFAULT Printer brauchst du das nicht, da kannst du auch ein XbpPrinter() objekt erzeugen und den Namen abfragen.

Code: Alles auswählen

proc main
   local oXP
   oXP := XbpPrinter():new()
   if oXP # NIL
      ? "Druckerliste"
      aeval( oXP:List(), {|cP| qout( "'"+cP+"'" ) } )
      ?
      ? "Default Drucker"
      oXP:create()
      ? "'"+oXP:devName+"'"
      oXP:destroy()
   else
      ? "Fehler bei Druckerabfrage"
   endif
   ?
   wait
return
Gruß
Hubert
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Dll Funktion wird nicht mehr gefunden

Beitrag von Magic »

georg hat geschrieben:Bist Du Dir sicher, dass der API-Name korrekt geschrieben ist?
Also nur "GetDefaultPrinter" funktioniert genau so wenig. Die andere Schreibweise (ich weis nicht mehr woher ich es übernommen habe) nutze ich bereits sein einigen Jahren - bisher problemlos. Es solle auch schon deswegen richtig sein, denn die zuvor kompilierten Versionen finden die Funktion unter den Namen. Merkwürdig das Ganze ...
Gruß,
Magic
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: Dll Funktion wird nicht mehr gefunden

Beitrag von brandelh »

Hi,

du musst intern oder in einer CH eine Funktion aufrufen. GetDefaultPrinter() ist zwar der offizielle Name, aber seit es UNICODE gibt ...
GetDefaultPrinterA() oder GetDefaultPrinterW()

Hier ist die Definition von PowerBasic:

Code: Alles auswählen

DECLARE FUNCTION GetDefaultPrinterA LIB "WinSpool.drv" _
    ALIAS "GetDefaultPrinterA" ( _
    pszBuffer  AS ASCIIZ, _
    pcchBuffer AS DWORD _
    ) AS LONG  ' BOOL
und ein passendes Programm

Code: Alles auswählen

#COMPILE EXE
#DIM ALL
#INCLUDE "winSpool.inc"

FUNCTION PBMAIN () AS LONG
   LOCAL b AS ASCIIZ * 256
   LOCAL n AS DWORD
   n = 256
   ? "Len",n
   ? "Rückgabe",GetDefaultPrinterA(b,n)
   ? LEFT$(b,n)
   WAITKEY$

END FUNCTION 
Gruß
Hubert
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Dll Funktion wird nicht mehr gefunden

Beitrag von Magic »

brandelh hat geschrieben:Aber für den DEFAULT Printer brauchst du das nicht, da kannst du auch ein XbpPrinter() objekt erzeugen und den Namen abfragen.
Die Möglichkeit kannte ich bisher nicht. Die Stelle werde ich dann schon mal ändern. Weg mit dem Dll Aufruf, ist dann auch leichter zu lesen / warten.

Kann ich mit der XbpPrinter() Klasse einen Drucker auch als Default setzen?
Momentan nutze ich dafür ebenfalls eine DLL Funktion: "wapiSetDefaultPrinter(...)"
Gruß,
Magic
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: Dll Funktion wird nicht mehr gefunden

Beitrag von brandelh »

Nein, DEFAULT für das Betriebssystem nicht. Aber bei CREATE() kannst du einen aus der Liste ( oXP:List() ) eintragen.

Die DLL Funktionen kann man aber recht einfach erstellen ... folgt gleich ;-)
Gruß
Hubert
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: Dll Funktion wird nicht mehr gefunden

Beitrag von brandelh »

SetDefaultPrinter() ist einfacher als GetDefaultPrinter() ;-)

Code: Alles auswählen

#include "dll.ch"

procedure MAIN

   msgbox( "Standarddrucker: '"+GetDefaultPrinter()+"'" )
   SetDefaultPrinter("Adobe PDF") // muss genauso geschrieben vorhanden sein !
   msgbox( "Neu: '"+GetDefaultPrinter()+"'" )

return

function GetDefaultPrinter()
   local nDLL := dllload("WinSpool.drv")
   local cBuffer := space(1024)
   local nLen := len(cBuffer)
   if empty(nDLL)
      return ""
   else
      if 0 = dllCall( nDLL, DLL_STDCALL , "GetDefaultPrinterA", @cBuffer, @nLen)
         return ""
      else
         cBuffer := left(cBuffer,nLen-1) // chr(0) ist in nLen enthalten !
      endif
   endif
return cBuffer

function SetDefaultPrinter(cPrinterName)
   local nDLL := dllload("WinSpool.drv")
   local IsOK := .f.
   if ! empty(nDLL)
      IsOK := ( 0 <> dllCall( nDLL, DLL_STDCALL , "SetDefaultPrinterA", cPrinterName) )
   endif
return IsOK
Gruß
Hubert
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Dll Funktion wird nicht mehr gefunden

Beitrag von Magic »

brandelh hat geschrieben: GetDefaultPrinter() ist zwar der offizielle Name, aber seit es UNICODE gibt ...
GetDefaultPrinterA() oder GetDefaultPrinterW()
Das war der entscheidende Hinweis :!:

Nach Einfügen des ALIAS im unteren Code, funktioniert alles wieder wie gewohnt.

Code: Alles auswählen

DLLFUNCTION wapiGetDefaultPrinter( @pPrinter, @pwdBufferSize ) ;
            ALIAS GetDefaultPrinterA ;
            USING OSAPI ;
            FROM WINSPOOL.DRV
Magic hat geschrieben:Irgendetwas muss ich mal gedreht haben, ohne mich jetzt daran erinnern zu können.
georg hat geschrieben:der Compiler übernimmt den DLL-Aufruf ohne Prüfung, daher wirst Du von dort keinen Fehler bekommen, selbst wenn Du "diesefunktiongibtesbestimmtueberhauptnicht" verwenden würdest.
Jetzt ist der Groschen auch gefallen ... hat ja auch lange genug gedauert :roll:
Im Zuge dieser Diskussion http://www.xbaseforum.de/viewtopic.php?f=30&t=6537 habe ich den ALIAS entfernt und nicht mitbekommen das es ab da an nicht mehr richtig funktioniert hat.

:wav: Vielen Dank :!: :wav:
Das hätte ich sonst noch Tagelang nicht gesehen!
Gruß,
Magic
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: Dll Funktion wird nicht mehr gefunden

Beitrag von brandelh »

Und wenn du statt dessen meine obigen Funktionen mit deinem wapi Namen nimmst, kannst du auch die /WU Warnungen unterdrücken ;-)
Gruß
Hubert
Antworten