AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein DelphiTwain findet keine Geräte in Delphi 10.1 - in XE4 alles ok
Thema durchsuchen
Ansicht
Themen-Optionen

DelphiTwain findet keine Geräte in Delphi 10.1 - in XE4 alles ok

Ein Thema von mts · begonnen am 7. Jan 2022 · letzter Beitrag vom 9. Jan 2022
Antwort Antwort
Seite 1 von 2  1 2      
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
726 Beiträge
 
Delphi 12 Athens
 
#1

AW: DelphiTwain findet keine Geräte in Delphi 10.1 - in XE4 alles ok

  Alt 7. Jan 2022, 18:25
Hallo zusammen,

Habe hier ein ganz verrücktes Problem.
Ich nutze DelphiTwain schon seit geraumer Zeit.
Jetzt habe ich eine Anwendung von XE4 auf Delphi 10.1 migriert und delphiTwain findet keine Scanner mehr.

Habe daraufhin einfach die Sample-Anwendung (DelphiTwainDemo2) kompiliert. In Delphi XE4 werden sofort die Scanner angezeigt, in Delphi 10.1 keine.
- Beides 32bit Anwendungen
- LoadLibrary läd in beiden Fällen erfolgreich die gleiche dll (c:\windows\TWAIN_32.DLL)

Das Problem tritt in der Methode "TCustomDelphiTwain.EnumerateDevices()" auf.
Delphi XE4:
Code:
    CallRes := TwainProc(AppInfo, nil, DG_CONTROL, DAT_IDENTITY,
      MSG_GETFIRST, @NewSource.Structure);

>>   CallRes = 0
Delphi 10.1:
Code:
    CallRes := TwainProc(AppInfo, nil, DG_CONTROL, DAT_IDENTITY,
      MSG_GETFIRST, @NewSource.Structure);

>>   CallRes = 1
Hat irgendjemand eine Idee oder evtl. das gleiche Problem schon gehabt?
Eventuell liegt es an einer Änderung von Optionen wie dem Record-Alignment. Zeig mal die Deklaration des Typs von Newsource.Structure.
Peter Below
  Mit Zitat antworten Zitat
mts

Registriert seit: 14. Dez 2008
24 Beiträge
 
Delphi XE4 Professional
 
#2

AW: DelphiTwain findet keine Geräte in Delphi 10.1 - in XE4 alles ok

  Alt 7. Jan 2022, 18:55

Eventuell liegt es an einer Änderung von Optionen wie dem Record-Alignment. Zeig mal die Deklaration des Typs von Newsource.Structure.
Genau das glaube ich auch.
Ich habe mir die original-header mal angeschaut (https://github.com/twain/twain-speci...ns/2.4/twain.h)
Alle structs sind pack(2) aligned. Soweit ich weiß ist ein Delphi "packed record" aber pack(1).

Wundere mich bloß wie der jemals laufen konnte? Oder übersehe ich hier was?

Die Änderung in das hier hat aber auch nix gebracht:
{$A2}
TW_IDENTITY = record
...

vorher:
Code:
  TW_IDENTITY = packed record
    Id: TW_UINT32;            { Unique number. In Windows, application hWnd }
    Version: TW_VERSION ;     { Identifies the piece of code }
    ProtocolMajor: TW_UINT16; { Application and DS must set to TWON_PROTOCOLMAJOR }
    ProtocolMinor: TW_UINT16; { Application and DS must set to TWON_PROTOCOLMINOR }
    SupportedGroups: TW_UINT32; { Bit field OR combination of DG_ constants }
    Manufacturer: TW_STR32;  { Manufacturer name, e.g. "Hewlett-Packard" }
    ProductFamily: TW_STR32; { Product family name, e.g. "ScanJet" }
    ProductName: TW_STR32;   { Product name, e.g. "ScanJet Plus" }
  end;
>> Ich bin mittlerweile zu 90% sicher, dass es etwas mit dem byte-alignment zu tun hat. Finde allerdings keine Info, dass dort etwas geändert wurde.

Hier die komplette Funktion mal auf das wesentliche runtergebrochen (funktioniert in XE4, funktioniert nicht in 10.1):
Code:
var
  _Handle: HInst;
  _TwainProc: TDSMEntryProc;
  res : boolean;
  resI : integer;
  idn : TW_IDENTITY;
  newS : TW_IDENTITY;
  hndl : THandle;
begin
  _Handle := LoadLibrary('c:\Windows\twain_32.dll');;
  if (_Handle = INVALID_HANDLE_VALUE) then exit;

  _TwainProc := nil;
  @_TwainProc := GetProcAddress(_Handle, MakeIntResource(1));
  if (@_TwainProc = nil) then exit;

  idn.Id := 0;
  idn.Version.MajorNum := 0;
  idn.Version.MinorNum := 0;
  idn.Version.Language := 0;
  idn.Version.Country := 0;
  idn.Version.Info := '';
  idn.ProtocolMajor := 1;
  idn.ProtocolMinor := 9;
  idn.SupportedGroups := DG_CONTROL or DG_IMAGE;
  idn.Manufacturer := '';
  idn.ProductFamily := '';
  idn.ProductName := '';

  hndl := Handle;
  res := _TwainProc(@idn, nil, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, @hndl) = TWRC_SUCCESS; //source manager loaded
  if (not res) then exit;

  newS := idn;
  newS.Id := 0;
  resI := _TwainProc(@idn, nil, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, @newS);
  if (resI = 0) then
    ShowMessage('gut');

Geändert von mts ( 7. Jan 2022 um 19:57 Uhr)
  Mit Zitat antworten Zitat
mts

Registriert seit: 14. Dez 2008
24 Beiträge
 
Delphi XE4 Professional
 
#3

AW: DelphiTwain findet keine Geräte in Delphi 10.1 - in XE4 alles ok

  Alt 7. Jan 2022, 20:18
was mich aber irritiert ist dieses Video: https://www.youtube.com/watch?v=2hJnehiB_hE&t=315s

Hier benutzt jemand ebenfalls DelphiTwain mit Delphi 10.3 (http://www.kluug.net/delphitwain.php) und bei ihm läuft alles.
Was ist jetzt bei mir anders?
  Mit Zitat antworten Zitat
johndoe049

Registriert seit: 22. Okt 2006
176 Beiträge
 
#4

AW: DelphiTwain findet keine Geräte in Delphi 10.1 - in XE4 alles ok

  Alt 7. Jan 2022, 21:55
was mich aber irritiert ist dieses Video: https://www.youtube.com/watch?v=2hJnehiB_hE&t=315s

Hier benutzt jemand ebenfalls DelphiTwain mit Delphi 10.3 (http://www.kluug.net/delphitwain.php) und bei ihm läuft alles.
Was ist jetzt bei mir anders?
Im verlinkten Archiv ist eine Datei anders.

Datei: DelphiTwainUtils.pas

Zeile 338: if (Value > 0) and (Value >= Count) then

In der Originaldatei steht if (Value > 0) and (Value <= Count) then
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#5

AW: DelphiTwain findet keine Geräte in Delphi 10.1 - in XE4 alles ok

  Alt 7. Jan 2022, 22:26
Ich sehe noch einige Unterschiede mehr..
Vergleich zwischen.
http://delphitwain.sourceforge.net und delphitwain-kluug-1-5--2014-06-25.zip

Unicode Version nicht geprüft.
https://stackoverflow.com/questions/...nts-for-delphi
und noch einiges hier!
https://www.delphipraxis.net/1179589-post3.html

Geändert von venice2 (18. Feb 2022 um 09:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.573 Beiträge
 
Delphi 12 Athens
 
#6

AW: DelphiTwain findet keine Geräte in Delphi 10.1 - in XE4 alles ok

  Alt 7. Jan 2022, 23:26
Dein Screenshot sieht mir rechts nach Anpassungen für 32- und 64-Bit aus.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
mts

Registriert seit: 14. Dez 2008
24 Beiträge
 
Delphi XE4 Professional
 
#7

AW: DelphiTwain findet keine Geräte in Delphi 10.1 - in XE4 alles ok

  Alt 8. Jan 2022, 09:11
[QUOTE=mts;1500243]

Code:
var
  _Handle: HInst;
  _TwainProc: TDSMEntryProc;
  res : boolean;
  resI : integer;
  idn : TW_IDENTITY;
  newS : TW_IDENTITY;
  hndl : THandle;
begin
  _Handle := LoadLibrary('c:\Windows\twain_32.dll');;
  if (_Handle = INVALID_HANDLE_VALUE) then exit;

  _TwainProc := nil;
  @_TwainProc := GetProcAddress(_Handle, MakeIntResource(1));
  if (@_TwainProc = nil) then exit;

  idn.Id := 0;
  idn.Version.MajorNum := 0;
  idn.Version.MinorNum := 0;
  idn.Version.Language := 0;
  idn.Version.Country := 0;
  idn.Version.Info := '';
  idn.ProtocolMajor := 1;
  idn.ProtocolMinor := 9;
  idn.SupportedGroups := DG_CONTROL or DG_IMAGE;
  idn.Manufacturer := '';
  idn.ProductFamily := '';
  idn.ProductName := '';

  hndl := Handle;
  res := _TwainProc(@idn, nil, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, @hndl) = TWRC_SUCCESS; //source manager loaded
  if (not res) then exit;

  newS := idn;
  newS.Id := 0;
  resI := _TwainProc(@idn, nil, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, @newS);
  if (resI = 0) then
    ShowMessage('gut');
Das ist der komplette code, den man zum testen braucht. Wie man sieht nutze ich hier keine Funktionen aus irgendeiner Lib. Nutze nur die twain.pas header Datei.
Unter Delphi XE4 wird „gut“ ausgegeben, auf Delphi 10.1 nicht.

Es MUSS also an der TW_Identity Struktur liegen.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: DelphiTwain findet keine Geräte in Delphi 10.1 - in XE4 alles ok

  Alt 8. Jan 2022, 17:29

Code:
  _Handle := LoadLibrary('c:\Windows\twain_32.dll');
ist sichergestellt das diese datei immer an diesem ort zu finden ist?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.573 Beiträge
 
Delphi 12 Athens
 
#9

AW: DelphiTwain findet keine Geräte in Delphi 10.1 - in XE4 alles ok

  Alt 8. Jan 2022, 19:11
In Win95 war sie schon dort.

Die 16 Bit-Variante heißt wohl twain.dll (jedenfalls sah ich vorhin in Win95 die twain.dll und twain_32.dll an jener Stelle)
aber wo 64-Bit ist ... k.A.


Und System-DLLs ruft man niemals mit absolutem Pfad auf.

Wegen soeinem Scheiß war Microsoft auf die Idee gekommen, dass die Systempartition immer C: heißt, weil zuviele alte schrottige Programme mit hartcodierten Pfaden daherkamen.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 8. Jan 2022 um 19:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: DelphiTwain findet keine Geräte in Delphi 10.1 - in XE4 alles ok

  Alt 8. Jan 2022, 20:21
Und System-DLLs ruft man niemals mit absolutem Pfad auf.
Darauf wollte ich hinaus, obwohl es daran nicht liegen kann, denke ich mal.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz