Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi 32 zu 64Bit DLL (https://www.delphipraxis.net/193447-32-zu-64bit-dll.html)

EWeiss 1. Aug 2017 16:57

32 zu 64Bit DLL
 
War bei einem Kumpel und habe da meine DLL von 32BIT nach 64BIT kompiliert.
DLL wird erstellt.


Wenn ich jetzt eine *.LIB daraus generieren will kommt folgende Meldung!
implib.exe /s KVideoPlayer.lib KVideoPlayer.dll
Zitat:

Error(9): Corrupt NT DLL (too short for export table)
auch mit
dumpbin /exports KVideoPlayer.dll >KVideoPlayer.def

Bekomme ich quasi eine leere DEF.

Öffne ich die DLL mit Dependency Walker meldet er mir.
Zitat:

Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module.
Error: Modules with different CPU types were found.
IN VC kann ich damit nichts anfangen da mir die *.lib für 64BIT fehlt.
Was kann ich tun?


gruss

mensch72 1. Aug 2017 17:16

AW: 32 zu 64Bit DLL
 
das mit den DLLs ist bei mir zwar schon lange her, aber ich hatte glaube ich immer (automatisch) zuerst per impdef eine "*.def" erzeugt und darauf dann per implib eine LIB.

Am besten hat das damals glaube ich immer mit den "implib" und "impdef" geklappt, welche beim RadStudio für/von C++Builder mit dabei waren.

EWeiss 1. Aug 2017 17:28

AW: 32 zu 64Bit DLL
 
Zitat:

Zitat von mensch72 (Beitrag 1377851)
das mit den DLLs ist bei mir zwar schon lange her, aber ich hatte glaube ich immer (automatisch) zuerst per impdef eine "*.def" erzeugt und darauf dann per implib eine LIB.

Am besten hat das damals glaube ich immer mit den "implib" und "impdef" geklappt, welche beim RadStudio für/von C++Builder mit dabei waren.

NA ja das hilft mir leider nicht denn dieser Fehler ist schon seltsam.
Zitat:

Error(9): Corrupt NT DLL (too short for export table)
am Anfang der Library (DLL) steht irgend ein _fastCall Wrapper.
Eventuell kommt implib damit nicht zurecht.
Denn die DLL ist 3,5 MB groß (ja das leidige Problem mit den Dateigrößen um das zweifache gestiegen)
vorher 1,1 jetzt 3,5

gruss

jaenicke 1. Aug 2017 17:54

AW: 32 zu 64Bit DLL
 
Ich rate mal... fehlt bei dir vielleicht die passende C++ Runtime für 64 Bit?

EWeiss 1. Aug 2017 18:02

AW: 32 zu 64Bit DLL
 
Zitat:

Zitat von jaenicke (Beitrag 1377853)
Ich rate mal... fehlt bei dir vielleicht die passende C++ Runtime für 64 Bit?

Keine Ahnung ist nicht mein Berlin.. muss mich da mal informieren.

Ich habe es jetzt mal mit MKEXP.EXE versucht.
VS meldet mir dann das die LIB Fehlerhaft sei.

Die DLL wird ohne Fehler compiliert\erstellt.
Kann mir jetzt nicht vorstellen das irgendetwas fehlt.

Mit was kann ich eine 64BIT DEF und 64BIT Lib erstellen ?
Poah... Delphi immer mit seinen extra einheiten.

gruss

Zacherl 1. Aug 2017 19:07

AW: 32 zu 64Bit DLL
 
Zitat:

Zitat von EWeiss (Beitrag 1377850)
Zitat:

Error: Modules with different CPU types were found.

Das deutet für mich darauf hin, dass hier irgendwo ein Konflikt zwischen 32 und 64-Bit vorliegt. Also irgendeins der Tools (oder sogar MSVC) davon ausgeht, dass es mit einer 32-Bit DLL arbeitet, du aber die 64-Bit DLL reinfütterst (oder umgekehrt). Vielleicht brauchst du da irgendwo einen Commandline-Switch, um die CPU Architektur zu übergeben oder sowas in der Art.

Edit: Okay das lag wohl daran, dass IMPLIB.EXE tatsächlich nur für 32-Bit ist. MKEXP.EXE ist laut meiner Recherche auf jeden Fall die richtige Wahl. Gibt dir der VS Linker evtl. einen Error-Code?

EWeiss 1. Aug 2017 19:14

AW: 32 zu 64Bit DLL
 
Zitat:

Zitat von Zacherl (Beitrag 1377858)
Zitat:

Zitat von EWeiss (Beitrag 1377850)
Zitat:

Error: Modules with different CPU types were found.

Das deutet für mich darauf hin, dass hier irgendwo ein Konflikt zwischen 32 und 64-Bit vorliegt. Also irgendeins der Tools (oder sogar MSVC) davon ausgeht, dass es mit einer 32-Bit DLL arbeitet, du aber die 64-Bit DLL reinfütterst (oder umgekehrt). Vielleicht brauchst du da irgendwo einen Commandline-Switch, um die CPU Architektur zu übergeben oder sowas in der Art.

Edit: Okay das lag wohl daran, dass IMPLIB.EXE tatsächlich nur für 32-Bit ist. MKEXP.EXE ist laut meiner Recherche auf jeden Fall die richtige Wahl. Gibt dir der VS Linker evtl. einen Error-Code?

Kann ich aber nicht verstehen.
Entweder Tokyo kann 64Bit DLL's erstellen oder nicht.
Nur dann sollten sie auch von anderen Sprachen erkannt werden.

Wenn jemand Bock hat meinen Source selbst mal als 64BIT zu kompilieren bescheid sagen schicke den dann über MAIL.
Bei mir will das irgendwo nicht obwohl die DLL ohne murren erstellt wird.

EDIT:
Zitat:

Gibt dir der VS Linker evtl. einen Error-Code?
Ja korrupte LIB

gruss

Zacherl 1. Aug 2017 20:16

AW: 32 zu 64Bit DLL
 
Ich denke nicht, dass es am Kompilat liegt. Das PE Format ist eindeutig definiert und die Export Table - aus der die .lib bzw. .def generiert wird - auch. Ich vermute eher, dass mit der .lib alles ok ist, aber du in Visual Studio falsche Einstellungen gewählt hast.

EWeiss 1. Aug 2017 20:26

AW: 32 zu 64Bit DLL
 
Zitat:

Zitat von Zacherl (Beitrag 1377861)
Ich denke nicht, dass es am Kompilat liegt. Das PE Format ist eindeutig definiert und die Export Table - aus der die .lib bzw. .def generiert wird - auch. Ich vermute eher, dass mit der .lib alles ok ist, aber du in Visual Studio falsche Einstellungen gewählt hast.

Ich habe dort nichts geändert.
Wenn ich die 32BIT lib mit impLib.exe oder mkexp.exe erstelle dann ist dies in beiden fällen korrupt.
Deshalb geht auch die 64BitLib nicht.

Die 32Bit Library funktioniert einwandfrei.

Die 64Bit nicht.

Mit
LIB /DEF:KVideoPlayer.DEF funktioniert das erstellen einer 64Bit Lib nicht.
Bei 32Bit einwandfrei.

Zitat:

Fehler LNK2019 Verweis auf nicht aufgelöstes externes Symbol "KVideo_GetMediaProperty" in Funktion ""int __cdecl InitInstance(struct HINSTANCE__ *,int)" (?InitInstance@@YAHPEAUHINSTANCE__@@H@Z)". KVPlayer
Es wird dann der falsche Verweis gelesen.
Zitat:

Fehler LNK2019 Verweis auf nicht aufgelöstes externes Symbol "_KVideo_Initialize@8" in Funktion ""int __cdecl InitInstance(struct HINSTANCE__ *,int)" (?InitInstance@@YAHPAUHINSTANCE__@@H@Z)".
Es fehlt die Anzahl der Bytes beim Symbol so wie als Beispiel hier _KVideo_Initialize@8 die @8.

gruss

Zacherl 1. Aug 2017 20:44

AW: 32 zu 64Bit DLL
 
Ahh das kann ich dir sogar erklären. Das Name-Mangling mit vorranstehendem _ (bzw. ohne bei
Delphi-Quellcode:
cdecl
) und folgendem @n ist nur für die
Delphi-Quellcode:
stdcall
Calling-Convention. Unter 64-Bit werden allerdings sämtliche expliziten Calling-Conventions ignoriert und überall der 64-Bit vector-call verwendet (von Delphi-Seite aus).

Siehe dazu auch:
https://en.wikipedia.org/wiki/X86_ca...ing_convention
https://en.wikipedia.org/wiki/Name_mangling

Edit:
Aber wenn ich das richtig sehe, exportiert deine DLL ja scheinbar eh auch eine ungemanglete Version. Kannst du mal sowohl die aktuelle 64-Bit DLL (als Kompilat) als auch den C/C++ Header mit Testprojekt hochladen? Dann würde ich mal drüberschauen.

EWeiss 1. Aug 2017 20:50

AW: 32 zu 64Bit DLL
 
Zitat:

Zitat von Zacherl (Beitrag 1377863)
Ahh das kann ich dir sogar erklären. Das Name-Mangling mit vorranstehendem _ (bzw. ohne bei
Delphi-Quellcode:
cdecl
) und folgendem @n ist nur für die
Delphi-Quellcode:
stdcall
Calling-Convention. Unter 64-Bit werden allerdings sämtliche expliziten Calling-Conventions ignoriert und überall der 64-Bit vector-call verwendet (von Delphi-Seite aus).

Siehe dazu auch:
https://en.wikipedia.org/wiki/X86_ca...ing_convention
https://en.wikipedia.org/wiki/Name_mangling

Edit:
Aber wenn ich das richtig sehe, exportiert deine DLL ja scheinbar eh auch eine ungemanglete Version. Kannst du mal sowohl die aktuelle 64-Bit DLL (als Kompilat) als auch den C/C++ Header mit Testprojekt hochladen? Dann würde ich mal drüberschauen.

Danke für die Erklärung aber die LIB kann ich immer noch nicht erstellen. (Und wenn dann ist sie fehlerhaft)
Hmmm...
Zitat:

Warnung LNK4272 Bibliothekcomputertyp "X86" steht in Konflikt mit dem Zielcomputertyp "x64"
Wie bekomme ich eine 64BIT Lib erstellt... das wäre die frage.
Bin im Net am suchen wie blöde finde da nichts.


gruss

EWeiss 1. Aug 2017 21:29

AW: 32 zu 64Bit DLL
 
Das ist mein Problem!

Zitat:

lib /def:KVideoPlayer.def /out:KVideoPlayer.lib /machine:x64

Microsoft (R) Library Manager Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

LIB : warning LNK4012: Ungueltiger Wert "x64", muss "ALPHA, ARM, IX86, MIPS, MIPS16, MIPSR41XX, PPC, SH3, or SH4" sein; Option wir
LIB : warning LNK4068: /MACHINE nicht festgelegt; Standardwert IX86
Bibliothek KVideoPlayer.lib und Objekt KVideoPlayer.exp wird erstellt
Jetzt frage ich mich warum funktioniert denn "/machine:x64" bei anderen Leuten?
Kann doch irgendwo nicht sein.

Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

dumpbin /exports KVideoPlayer.dll >KVideoPlayer.def
Code:
Dump of file KVideoPlayer.dll

File Type: DLL

  Summary

        CD28 .bss
       46340 .data
         E3A .didata
         567 .edata
        4B32 .idata
       2D5C4 .pdata
          44 .rdata
       2AB34 .reloc
        7600 .rsrc
      31DC84 .text
Das ist alles was ich bekomme von der 64BIT DLL.
Der gleiche Befehl bei 32BIT

Code:
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file KVideoPlayer.dll

File Type: DLL

  Section contains the following exports for KVideoPlayer.dll

           0 characteristics
           0 time date stamp Thu Jan 01 01:00:00 1970
        0.00 version
           1 ordinal base
          78 number of functions
          78 number of names

    ordinal hint RVA     name

         78    0 000E9F88 KVideo_CloseFile
         39    1 000E9F88 KVideo_CloseFile@0
         77    2 000EA510 KVideo_CreateOverlayBaseImage
         38    3 000EA510 KVideo_CreateOverlayBaseImage@24
         76    4 000EA36C KVideo_DisplayModeChanged
         37    5 000EA36C KVideo_DisplayModeChanged@0
         75    6 000EA6B8 KVideo_GetCapturedImage
         36    7 000EA6B8 KVideo_GetCapturedImage@4
         74    8 000E9D94 KVideo_GetLastError
         35    9 000E9D94 KVideo_GetLastError@0
         73    A 000EA0B0 KVideo_GetMediaInfoText
         34    B 000EA0B0 KVideo_GetMediaInfoText@0
         72    C 000EA20C KVideo_GetMediaProperty
         33    D 000EA20C KVideo_GetMediaProperty@4
         71    E 000EA3FC KVideo_GetPlayerState
         32    F 000EA3FC KVideo_GetPlayerState@0
         70   10 000E9FB8 KVideo_GetStreamInfo
         31   11 000E9FB8 KVideo_GetStreamInfo@108
         69   12 000EA414 KVideo_GetStreamPosition
         30   13 000EA414 KVideo_GetStreamPosition@0
         68   14 000E9CE8 KVideo_GetVersion
         29   15 000E9CE8 KVideo_GetVersion@0
         67   16 000EA2D4 KVideo_GetViewSize
         28   17 000EA2D4 KVideo_GetViewSize@8
         66   18 000E9E20 KVideo_GetWorkingVR
         27   19 000E9E20 KVideo_GetWorkingVR@0
         65   1A 000EA14C KVideo_GetXySubFilter
         26   1B 000EA14C KVideo_GetXySubFilter@4
         64   1C 000EA574 KVideo_HasOverlayImage
         25   1D 000EA574 KVideo_HasOverlayImage@0
         63   1E 000E9D14 KVideo_Initialize
         24   1F 000E9D14 KVideo_Initialize@8
         62   20 000EA304 KVideo_KeepAspectRatio
         23   21 000EA304 KVideo_KeepAspectRatio@4
         61   22 000EA078 KVideo_MediaInfoServiceReady
         22   23 000EA078 KVideo_MediaInfoServiceReady@0
         60   24 000E9E84 KVideo_OpenFile
         59   25 000E9EE4 KVideo_OpenFile2
         20   26 000E9EE4 KVideo_OpenFile2@8
         21   27 000E9E84 KVideo_OpenFile@4
         58   28 000EA3B4 KVideo_Pause
         19   29 000EA3B4 KVideo_Pause@0
         57   2A 000EA390 KVideo_Play
         18   2B 000EA390 KVideo_Play@0
         56   2C 000EA598 KVideo_PutOverlayImage
         17   2D 000EA598 KVideo_PutOverlayImage@24
         55   2E 000E9D58 KVideo_Release
         16   2F 000E9D58 KVideo_Release@0
         54   30 000EA348 KVideo_Repaint
         15   31 000EA348 KVideo_Repaint@0
         53   32 000EA324 KVideo_Resize
         14   33 000EA324 KVideo_Resize@0
         52   34 000EA04C KVideo_SelectAudioStream
         13   35 000EA04C KVideo_SelectAudioStream@4
         51   36 000EA020 KVideo_SelectVideoStream
         12   37 000EA020 KVideo_SelectVideoStream@4
         50   38 000E9E2C KVideo_SetLAVFiltersFolder
         11   39 000E9E2C KVideo_SetLAVFiltersFolder@4
         49   3A 000E9F68 KVideo_SetPlaybackRate
         10   3B 000E9F68 KVideo_SetPlaybackRate@4
         48   3C 000E9F48 KVideo_SetSearchMode
          9   3D 000E9F48 KVideo_SetSearchMode@4
         47   3E 000EA468 KVideo_SetStreamPosition
          8   3F 000EA468 KVideo_SetStreamPosition@8
         46   40 000E9E00 KVideo_SetVideoRenderer
          7   41 000E9E00 KVideo_SetVideoRenderer@4
         45   42 000EA4DC KVideo_SetVolume
          6   43 000EA4DC KVideo_SetVolume@4
         44   44 000EA090 KVideo_ShowMediaInfo
          5   45 000EA090 KVideo_ShowMediaInfo@0
         43   46 000EA1C0 KVideo_ShowXySubFilterPropertyPage
          4   47 000EA1C0 KVideo_ShowXySubFilterPropertyPage@4
         42   48 000EA3D8 KVideo_Stop
          3   49 000EA3D8 KVideo_Stop@0
         41   4A 000EA630 KVideo_UpdateOverlayImage
          2   4B 000EA630 KVideo_UpdateOverlayImage@4
         40   4C 000EA11C KVideo_XySubFilterState
          1   4D 000EA11C KVideo_XySubFilterState@8
tja was nun.

gruss

EWeiss 2. Aug 2017 01:54

AW: 32 zu 64Bit DLL
 
Zitat:

Edit:
Aber wenn ich das richtig sehe, exportiert deine DLL ja scheinbar eh auch eine ungemanglete Version. Kannst du mal sowohl die aktuelle 64-Bit DLL (als Kompilat) als auch den C/C++ Header mit Testprojekt hochladen? Dann würde ich mal drüberschauen.
Jo hier.
Es wird aber die MadVr benötigt damit ein Video läuft.
Aber zum kompilieren benötigt man die erst mal nicht.

Die KVideoPlayer.dll mit Unterstrich ist die in 64BIT.

Das Projekt läuft unter 32BIT. LIB in 32BIT ist dabei.
Eine 64BIT LIB habe ich noch nicht erstellen können warum auch immer das fehl schlägt.
Mein Delphi Projekt läuft ohne Probleme komplett in 64Bit inc. den ganzen Anhang (3rd Party DLL's).

Die Exports in Delphi sehen so aus.

Delphi-Quellcode:
exports
  KVideo_CloseFile,
  KVideo_CreateOverlayBaseImage,
  KVideo_DisplayModeChanged,
  KVideo_GetCapturedImage,
  KVideo_GetLastError,
  KVideo_GetMediaInfoText,
  KVideo_GetMediaProperty,
  KVideo_GetPlayerState,
  KVideo_GetStreamInfo,
  KVideo_GetStreamPosition,
  KVideo_GetVersion,
  KVideo_GetViewSize,
  KVideo_GetWorkingVR,
  KVideo_GetXySubFilter,
  KVideo_HasOverlayImage,
  KVideo_Initialize,
  KVideo_KeepAspectRatio,
  KVideo_MediaInfoServiceReady,
  KVideo_OpenFile2,
  KVideo_OpenFile,
  KVideo_Pause,
  KVideo_Play,
  KVideo_PutOverlayImage,
  KVideo_Release,
  KVideo_Repaint,
  KVideo_Resize,
  KVideo_SelectAudioStream,
  KVideo_SelectVideoStream,
  KVideo_SetLAVFiltersFolder,
  KVideo_SetPlaybackRate,
  KVideo_SetSearchMode,
  KVideo_SetStreamPosition,
  KVideo_SetVideoRenderer,
  KVideo_SetVolume,
  KVideo_ShowMediaInfo,
  KVideo_ShowXySubFilterPropertyPage,
  KVideo_Stop,
  KVideo_UpdateOverlayImage,
  KVideo_XySubFilterState,

  KVideo_CloseFile                  name 'KVideo_CloseFile@0',
  KVideo_CreateOverlayBaseImage     name 'KVideo_CreateOverlayBaseImage@24',
  KVideo_DisplayModeChanged         name 'KVideo_DisplayModeChanged@0',
  KVideo_GetCapturedImage           name 'KVideo_GetCapturedImage@4',
  KVideo_GetLastError               name 'KVideo_GetLastError@0',
  KVideo_GetMediaInfoText           name 'KVideo_GetMediaInfoText@0',
  KVideo_GetMediaProperty           name 'KVideo_GetMediaProperty@4',
  KVideo_GetPlayerState             name 'KVideo_GetPlayerState@0',
  KVideo_GetStreamInfo              name 'KVideo_GetStreamInfo@108',
  KVideo_GetStreamPosition          name 'KVideo_GetStreamPosition@0',
  KVideo_GetVersion                 name 'KVideo_GetVersion@0',
  KVideo_GetViewSize                name 'KVideo_GetViewSize@8',
  KVideo_GetWorkingVR               name 'KVideo_GetWorkingVR@0',
  KVideo_GetXySubFilter             name 'KVideo_GetXySubFilter@4',
  KVideo_HasOverlayImage            name 'KVideo_HasOverlayImage@0',
  KVideo_Initialize                 name 'KVideo_Initialize@8',
  KVideo_KeepAspectRatio            name 'KVideo_KeepAspectRatio@4',
  KVideo_MediaInfoServiceReady      name 'KVideo_MediaInfoServiceReady@0',
  KVideo_OpenFile2                   name 'KVideo_OpenFile2@8',
  KVideo_OpenFile                   name 'KVideo_OpenFile@4',
  KVideo_Pause                      name 'KVideo_Pause@0',
  KVideo_Play                       name 'KVideo_Play@0',
  KVideo_PutOverlayImage            name 'KVideo_PutOverlayImage@24',
  KVideo_Release                    name 'KVideo_Release@0',
  KVideo_Repaint                    name 'KVideo_Repaint@0',
  KVideo_Resize                     name 'KVideo_Resize@0',
  KVideo_SelectAudioStream          name 'KVideo_SelectAudioStream@4',
  KVideo_SelectVideoStream          name 'KVideo_SelectVideoStream@4',
  KVideo_SetLAVFiltersFolder        name 'KVideo_SetLAVFiltersFolder@4',
  KVideo_SetPlaybackRate            name 'KVideo_SetPlaybackRate@4',
  KVideo_SetSearchMode              name 'KVideo_SetSearchMode@4',
  KVideo_SetStreamPosition          name 'KVideo_SetStreamPosition@8',
  KVideo_SetVideoRenderer           name 'KVideo_SetVideoRenderer@4',
  KVideo_SetVolume                  name 'KVideo_SetVolume@4',
  KVideo_ShowMediaInfo              name 'KVideo_ShowMediaInfo@0',
  KVideo_ShowXySubFilterPropertyPage name 'KVideo_ShowXySubFilterPropertyPage@4',
  KVideo_Stop                       name 'KVideo_Stop@0',
  KVideo_UpdateOverlayImage         name 'KVideo_UpdateOverlayImage@4',
  KVideo_XySubFilterState           name 'KVideo_XySubFilterState@8';
Zusätzlich nochmal die 64BIT unkomprimiert ansonsten kann man keine DEF erstellen. ;)

gruss

Zacherl 2. Aug 2017 04:52

AW: 32 zu 64Bit DLL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Kein Plan, was du falsch machst, aber bei mir funktioniert es:
Code:
dumpbin /exports _KVideoPlayer.dll
Microsoft (R) COFF/PE Dumper Version 14.10.25019.0
Copyright (C) Microsoft Corporation. All rights reserved.


Dump of file _KVideoPlayer.dll

File Type: DLL

  Section contains the following exports for _KVideoPlayer.dll

    00000000 characteristics
           0 time date stamp
        0.00 version
           1 ordinal base
          81 number of functions
          81 number of names

    ordinal hint RVA     name

         81    0 0030AF20 KVideo_CloseFile
         42    1 0030AF20 KVideo_CloseFile@0
         80    2 0030B680 KVideo_CreateOverlayBaseImage
    ...
Damit habe ich dann die .def Datei erstellt (neues Textdokument mit EXPORTS in der ersten Zeile und darunter alle Symbole in jeweils einer eigenen Zeile aufgeführt) und schließlich:
Code:
lib /MACHINE:X64 /DEF:_KVideoPlayer.def
Microsoft (R) Library Manager Version 14.10.25019.0
Copyright (C) Microsoft Corporation. All rights reserved.

   Bibliothek "_KVideoPlayer.lib" und Objekt "_KVideoPlayer.exp" werden erstellt.
Könnte höchstens daran liegen, dass deine VS Toolchain noch aus Vorkriegszeiten stammt :mrgreen:

Habe die resultierende .lib mal angehangen.

jaenicke 2. Aug 2017 05:29

AW: 32 zu 64Bit DLL
 
Zitat:

Zitat von EWeiss (Beitrag 1377865)
Microsoft (R) Library Manager Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

Wenn ich mich recht entsinne, wurde 64-Bit Unterstützung erst mit VC++ 2005 eingeführt. VC++ 6.0, aus dem dieses Tool stammt, hatte sie jedenfalls definitiv nicht.

EWeiss 2. Aug 2017 11:03

AW: 32 zu 64Bit DLL
 
Zitat:

Könnte höchstens daran liegen, dass deine VS Toolchain noch aus Vorkriegszeiten stammt
Ich habe VS2017 kann mir nicht denken das dass aus der Vorzeit stammt.

Ich kann jedoch nicht garantieren das die LIB.EXE die von VS2017 ist. (Eventuell wird die von VC (Aus Visual Studio 6 verwendet)
Seltsam ist ja schon das meine Exports gar nicht mit dem Flag lib /MACHINE:X64 akzeptiert wird.

Wirklich konfus.
Danke für den Upload.

Zitat:

VC++ 6.0, aus dem dieses Tool stammt, hatte sie jedenfalls definitiv nicht.
Arghh.. ja das hätte ich auch sehen müssen.
Muss mal sehen wie ich den Pfad zur LIB ändern kann.

EDIT:
Dein Archiv scheint beschädigt zu sein.

gruss

jaenicke 2. Aug 2017 11:41

AW: 32 zu 64Bit DLL
 
Zitat:

Zitat von EWeiss (Beitrag 1377889)
Ich kann jedoch nicht garantieren das die LIB.EXE die von VS2017 ist. (Eventuell wird die von VC (Aus Visual Studio 6 verwendet)

Das kann man in aktuellen Windowsversionen leicht prüfen. Einfach auf der Kommandozeile eingeben:
where lib.exe
Dann wird dir angezeigt wo die gefunden wird.

EWeiss 2. Aug 2017 11:45

AW: 32 zu 64Bit DLL
 
Zitat:

Zitat von jaenicke (Beitrag 1377893)
Zitat:

Zitat von EWeiss (Beitrag 1377889)
Ich kann jedoch nicht garantieren das die LIB.EXE die von VS2017 ist. (Eventuell wird die von VC (Aus Visual Studio 6 verwendet)

Das kann man in aktuellen Windowsversionen leicht prüfen. Einfach auf der Kommandozeile eingeben:
where lib.exe
Dann wird dir angezeigt wo die gefunden wird.

Wie kann ich denn die Umgebungsvariable von 2017 einstellen ?

gruss

Fritzew 2. Aug 2017 11:58

AW: 32 zu 64Bit DLL
 
Bei mir ist das:
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat"

Code:
 KVideo_CloseFile name 'KVideo_CloseFile@0',
  KVideo_CreateOverlayBaseImage name 'KVideo_CreateOverlayBaseImage@24',
  KVideo_DisplayModeChanged name 'KVideo_DisplayModeChanged@0',
  KVideo_GetCapturedImage name 'KVideo_GetCapturedImage@4',
Wieso exportierts Du die function 2 mal? und weshalb mit den @.....??

EWeiss 2. Aug 2017 12:11

AW: 32 zu 64Bit DLL
 
Zitat:

Zitat von Fritzew (Beitrag 1377897)
Bei mir ist das:
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat"

Code:
 KVideo_CloseFile name 'KVideo_CloseFile@0',
  KVideo_CreateOverlayBaseImage name 'KVideo_CreateOverlayBaseImage@24',
  KVideo_DisplayModeChanged name 'KVideo_DisplayModeChanged@0',
  KVideo_GetCapturedImage name 'KVideo_GetCapturedImage@4',
Wieso exportierts Du die function 2 mal? und weshalb mit den @.....??

Habe das so gelernt ;) und auch mit meiner Bass_Vis.dll gemacht irgendwo gab es da mal Fehler und das hat diese behoben.
Warum auch immer.
Das "@....." sind die Bytes der jeweiligen Datentypen die in der exportierten Funktion enthalten sind.
Bei 64Bit wie Zacherl sagt werden diese ignoriert.

Siehe die Funktionen im C-Header.
Wenn man das jedoch anders oder besser machen kann lerne ich gern dazu.

Habe die Bat ausgeführt wird aber weiterhin die 6 Version von LIB\DUMPBI verwendet

gruss

Fritzew 2. Aug 2017 12:20

AW: 32 zu 64Bit DLL
 
als *.cmd speichern
Code:
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat"
del *.lib
del *.exp
lib.exe /DEF:KVideoPlayer.def /MACHINE:X64 /OUT:KVideoPlayer_x64.lib
lib.exe /DEF:KVideoPlayer.def /MACHINE:X86 /OUT:KVideoPlayer_x86.lib
pause
Und jetzt noch die def:
Code:
LIBRARY    KVideoPlayer.DLL

EXPORTS
  KVideo_CloseFile
  KVideo_CreateOverlayBaseImage
  KVideo_DisplayModeChanged
  KVideo_GetCapturedImage
  KVideo_GetLastError
  KVideo_GetMediaInfoText
  KVideo_GetMediaProperty
  KVideo_GetPlayerState
  KVideo_GetStreamInfo
  KVideo_GetStreamPosition
  KVideo_GetVersion
  KVideo_GetViewSize
  KVideo_GetWorkingVR
  KVideo_GetXySubFilter
  KVideo_HasOverlayImage
  KVideo_Initialize
  KVideo_KeepAspectRatio
  KVideo_MediaInfoServiceReady
  KVideo_OpenFile2
  KVideo_OpenFile
  KVideo_Pause
  KVideo_Play
  KVideo_PutOverlayImage
  KVideo_Release
  KVideo_Repaint
  KVideo_Resize
  KVideo_SelectAudioStream
  KVideo_SelectVideoStream
  KVideo_SetLAVFiltersFolder
  KVideo_SetPlaybackRate
  KVideo_SetSearchMode
  KVideo_SetStreamPosition
  KVideo_SetVideoRenderer
  KVideo_SetVolume
  KVideo_ShowMediaInfo
  KVideo_ShowXySubFilterPropertyPage
  KVideo_Stop
  KVideo_UpdateOverlayImage
  KVideo_XySubFilterState
Mit der erzeugten lib kompiliert VS problemlos

Deine zusätzlichen Exporte kannst Du aus der Dll rauswerfen. Die brauchst Du nicht.

EWeiss 2. Aug 2017 12:22

AW: 32 zu 64Bit DLL
 
Zitat:

Deine zusätzlichen Exporte kannst Du aus der Dll rauswerfen. Die brauchst Du nicht.
Dann möchte ich aber gerne auch wissen warum nicht.

Siehe.
Zitat:

Das "@....." sind die Bytes der jeweiligen Datentypen die in der exportierten Funktion enthalten sind.
Bei 64Bit wie Zacherl sagt werden diese ignoriert.
Zitat:

Mit der erzeugten lib kompiliert VS problemlos
Ja bei dir aber bei mir wird immer noch LIB.exe von VS 6.0 verwendet daher geht es nicht.

gruss

Fritzew 2. Aug 2017 12:32

AW: 32 zu 64Bit DLL
 
Die werden von importierten C++ Funktionen benötigt.
da aber die Funktionen in Deinem Header als extern "C" deklariert sind werden diese nicht benötigt.
Das ganze nennt sich name mangling und ist c++ speziell
C++ <> C, und Delphi exportiert die Funktionen analog zu C

Immer wenn Der C++ Linker anmeckert das er irgend eine function name@xxx nicht findet fehlt ein extern "C"

jaenicke 2. Aug 2017 12:45

AW: 32 zu 64Bit DLL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von EWeiss (Beitrag 1377904)
Ja bei dir aber bei mir wird immer noch LIB.exe von VS 6.0 verwendet daher geht es nicht.

Das musst du im Systempfad einstellen. Dafür drückst du die Windows-Taste und gibst ein path oder umgebung, dann sollte das so ca. aussehen:
Anhang 47705
Je nach Betriebssystem sollte es trotzdem so ähnlich aussehen.

In dem letzten Fenster schiebst du dann den Pfad zu VC++ 6.0 nach unten hinter den der neuen Version oder löschst den von VC++ 6.0 ganz.

EWeiss 2. Aug 2017 12:45

AW: 32 zu 64Bit DLL
 
Zitat:

Zitat von Fritzew (Beitrag 1377905)
Die werden von importierten C++ Funktionen benötigt.
da aber die Funktionen in Deinem Header als extern "C" deklariert sind werden diese nicht benötigt.
Das ganze nennt sich name mangling und ist c++ speziell
C++ <> C, und Delphi exportiert die Funktionen analog zu C

Immer wenn Der C++ Linker anmeckert das er irgend eine function name@xxx nicht findet fehlt ein extern "C"

Ahh Danke ;)

Ich habe sie mal Auskommentiert.
Mit deiner *.cmd etwas angepasst..

Code:
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat"
 del *.lib
 del *.exp
 dumpbin /exports KVideoPlayer.dll >KVideoPlayer.def
 lib.exe /DEF:KVideoPlayer.def /MACHINE:X64 /OUT:KVideoPlayer_x64.lib
 lib.exe /DEF:KVideoPlayer.def /MACHINE:X86 /OUT:KVideoPlayer_x86.lib
 pause
Zitat:

KVideoPlayer.def : warning LNK4017: CD00-Anweisung wird von der Zielplattform nicht unterstuetzt; ignoriert
So 15 an der Zahl.

Die *.DEF scheint OK.
Die LIB nicht die ist gerade mal 2 KB groß und VC meldet 13 Verweise nicht aufgelöst.

Frustrierende das ganze ;)

gruss

Fritzew 2. Aug 2017 12:49

AW: 32 zu 64Bit DLL
 
Emil hör doch auf die def immer automatisch erzeugen zu wollen.
Benutze die def die ich da oben angehängt hatte.
Im Prinzip ist der Inhalt der *.def Datei einfach deine Exportsliste aus deinem Delphi Projekt.
Einfach ohne Kommas :-)

EWeiss 2. Aug 2017 12:54

AW: 32 zu 64Bit DLL
 
Zitat:

Zitat von Fritzew (Beitrag 1377908)
Emil hör doch auf die def immer automatisch erzeugen zu wollen.
Benutze die def die ich da oben angehängt hatte.
Im Prinzip ist der Inhalt der *.def Datei einfach deine Exportsliste aus deinem Delphi Projekt.
Einfach ohne Kommas :-)

Ja sorry so hatte ich es vorher ja auch gemacht ;)
Werde es nochmal versuchen.

Danke!

EDIT:
Jetzt funktioniert das ganze. :)
Dafür jetzt 3 ganze Seiten resultierend daraus weil mein Pfad zur LIB/DUMPBIN auf VS 6.0 gezeigt hat.
Danke nochmal an alle die mitgeholfen haben.

gruss

EWeiss 2. Aug 2017 15:48

AW: 32 zu 64Bit DLL
 
Ich hab jetzt soviel Arbeit mit der LIB gehabt aber vielleicht ist das doch der bessere weg.

gruss

Fritzew 2. Aug 2017 16:58

AW: 32 zu 64Bit DLL
 
Zitat:

Ich hab jetzt soviel Arbeit mit der LIB gehabt aber vielleicht ist das doch der bessere weg.
Ok Du hast das jetzt auf dynamisches laden umgebaut.....

Ich verstehe echt nicht was Du erreichen willst. Welches Problem soll denn gelöst werden?

EWeiss 2. Aug 2017 17:05

AW: 32 zu 64Bit DLL
 
Zitat:

Zitat von Fritzew (Beitrag 1377947)
Zitat:

Ich hab jetzt soviel Arbeit mit der LIB gehabt aber vielleicht ist das doch der bessere weg.
Ok Du hast das jetzt auf dynamisches laden umgebaut.....

Ich verstehe echt nicht was Du erreichen willst. Welches Problem soll denn gelöst werden?

Es gibt jetzt kein Problem mehr..
Werde vielleicht das C++ Sample noch etwas ausbauen damit es so aussieht wie in Delphi um alle Funktionen testen zu können.
Nur mit dem statischen laden ist man unabhängig von irgendwelchen Librarys

Zudem muss man dann nicht die Lib's hin und her verschieben. (etwas unabhängiger halt) :)
bzw. mehrere Builds erstellen.

gruss

Zacherl 2. Aug 2017 17:55

AW: 32 zu 64Bit DLL
 
Hin und her schieben muss man aber auch mit den .lib Dateien eigentlich nichts. Es ist ganz normal, dass du einen Library-Path für 32-Bit und einen dedizierten Pfad für 64-Bit hast. Den kannst du für jede Konfiguration (32 Release, 32 Debug, 64 Release, 64 Debug) unabhängig voneinander einstellen.

So wie du es gemacht hast (.lib einfach ins Projekt reingezogen) macht man das normalerweise nicht.

EWeiss 2. Aug 2017 18:00

AW: 32 zu 64Bit DLL
 
Zitat:

So wie du es gemacht hast (.lib einfach ins Projekt reingezogen) macht man das normalerweise nicht.
Ja entschuldige bitte bin blutiger Anfänger in VC. ;)

gruss

Fritzew 2. Aug 2017 18:14

AW: 32 zu 64Bit DLL
 
Also ich bin echt kein Fan von dynamisch geladenen Dll's. Das einzige was ich mir da gefallen lasse ist ein Pluginsystem und da sollte 1!!! Aufruf reichen zum registrieren.
Bei statisch gelinkten Code greift einfach schon zur Compile oder besser gesagt Link-Time die Fehlerprüfung.
Was in den Zusammenhang eigentlich immer geht ist delayed loading. Dann wird die Dll erst gezogen wenn Sie benutzt wird.
Ist aber wahrscheinlich Geschmacksache.
Aber ansonsten finde ich es gut wenn man über den Tellerrand schaut und auch mal etwas anderes probiert. In dem Sinne:
Viel Erfolg und Spass mit Deinem Projekt

Gruss

jaenicke 2. Aug 2017 18:33

AW: 32 zu 64Bit DLL
 
Wir benutzen für unsere Plugins Interfaces. Dadurch brauchen die einzelnen Plugins nicht die ganzen Funktionen einzeln exportieren und man kann via QueryInterface auch optionale Features sehr gut umsetzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz