浏览代码

Merge branch 'IS7ZipDec-msvc' into IS7ZipDec

Martijn Laan 11 月之前
父节点
当前提交
5fb7999898

+ 91 - 4
Projects/Src/Compression.SevenZipDecoder.pas

@@ -20,16 +20,103 @@ implementation
 uses
   Windows, SysUtils, Setup.LoggingFunc;
 
-{ Compiled by Embarcadero C++ 7.30 2022 using compile-bcc32c.bat
-  For Visual Studio use compile.bat and define VISUALSTUDIO below but currently this gives linker errors in Delphi }
+{ Compiled by Visual Studio 2022 using compile.bat
+  To enable source debugging recompile using compile-bcc32c.bat and turn off the VISUALSTUDIO define below
+  Note that in a speed test the code produced by bcc32c was about 33% slower }
 {$L Src\Compression.SevenZipDecoder\7zDecode\IS7zDec.obj}
+{$DEFINE VISUALSTUDIO}
 
 function IS_7zDec(const fileName: PChar; const fullPaths: Bool): Integer; cdecl; external name '_IS_7zDec';
 
-{.$DEFINE VISUALSTUDIO}
-
 //https://github.com/rust-lang/compiler-builtins/issues/403
 {$IFDEF VISUALSTUDIO}
+function __CreateDirectoryW(lpPathName: LPCWSTR;
+  lpSecurityAttributes: PSecurityAttributes): BOOL; cdecl;
+begin
+  Result := CreateDirectoryW(lpPathName, lpSecurityAttributes);
+end;
+
+function __CreateFileA(lpFileName: LPCSTR; dwDesiredAccess, dwShareMode: DWORD;
+  lpSecurityAttributes: PSecurityAttributes; dwCreationDisposition, dwFlagsAndAttributes: DWORD;
+  hTemplateFile: THandle): THandle; cdecl;
+begin
+  Result := CreateFileA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
+end;
+
+function __CreateFileW(lpFileName: LPCWSTR; dwDesiredAccess, dwShareMode: DWORD;
+  lpSecurityAttributes: PSecurityAttributes; dwCreationDisposition, dwFlagsAndAttributes: DWORD;
+  hTemplateFile: THandle): THandle; cdecl;
+begin
+  Result := CreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
+end;
+
+function __FileTimeToLocalFileTime(lpFileTime: PFileTime; var lpLocalFileTime: TFileTime): BOOL; cdecl;
+begin
+  Result := FileTimeToLocalFileTime(lpFileTime, lpLocalFileTime);
+end;
+
+function __GetFileSize(hFile: THandle; lpFileSizeHigh: Pointer): DWORD; cdecl;
+begin
+  Result := GetFileSize(hFile, lpFileSizeHigh);
+end;
+
+function __ReadFile(hFile: THandle; var Buffer; nNumberOfBytesToRead: DWORD;
+  var lpNumberOfBytesRead: DWORD; lpOverlapped: POverlapped): BOOL; cdecl;
+begin
+  Result := ReadFile(hFile, Buffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
+end;
+
+function __SetFileAttributesW(lpFileName: LPCWSTR; dwFileAttributes: DWORD): BOOL; cdecl;
+begin
+  Result := SetFileAttributesW(lpFileName, dwFileAttributes);
+end;
+
+function __SetFilePointer(hFile: THandle; lDistanceToMove: Longint;
+  lpDistanceToMoveHigh: Pointer; dwMoveMethod: DWORD): DWORD; cdecl;
+begin
+  Result := SetFilePointer(hFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod);
+end;
+
+function __SetFileTime(hFile: THandle;
+  lpCreationTime, lpLastAccessTime, lpLastWriteTime: PFileTime): BOOL; cdecl;
+begin
+  Result := SetFileTime(hFile, lpCreationTime, lpLastAccessTime, lpLastWriteTime);
+end;
+
+function __WriteFile(hFile: THandle; const Buffer; nNumberOfBytesToWrite: DWORD;
+  var lpNumberOfBytesWritten: DWORD; lpOverlapped: POverlapped): BOOL; cdecl;
+begin
+  Result := WriteFile(hFile, Buffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);
+end;
+
+function __CloseHandle(hObject: THandle): BOOL; cdecl;
+begin
+  Result := CloseHandle(hObject);
+end;
+
+function __GetLastError: DWORD; cdecl;
+begin
+  Result := GetLastError;
+end;
+
+function __LocalFree(hMem: HLOCAL): HLOCAL; cdecl;
+begin
+  Result := LocalFree(hMem);
+end;
+
+function __FormatMessageA(dwFlags: DWORD; lpSource: Pointer; dwMessageId: DWORD; dwLanguageId: DWORD;
+  lpBuffer: LPSTR; nSize: DWORD; Arguments: Pointer): DWORD; cdecl;
+begin
+  Result := FormatMessageA(dwFlags, lpSource, dwMessageId, dwLanguageId, lpBuffer, nSize, Arguments);
+end;
+
+function __WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD;
+  lpWideCharStr: LPWSTR; cchWideChar: Integer; lpMultiByteStr: LPSTR;
+  cchMultiByte: Integer; lpDefaultChar: LPCSTR; lpUsedDefaultChar: PBOOL): Integer; cdecl;
+begin
+  Result := WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, lpMultiByteStr, cchMultiByte, lpDefaultChar, lpUsedDefaultChar);
+end;
+
 procedure __allshl; register; external 'ntdll.dll' name '_allshl';
 procedure __aullshr; register; external 'ntdll.dll' name '_aullshr';
 {$ELSE}

+ 58 - 0
Projects/Src/Compression.SevenZipDecoder/7zDecode/IS7zDec.c

@@ -3,6 +3,64 @@
   This file is public domain (like the LZMA SDK)
 */
 
+#ifdef _MSC_VER
+
+/* Stop 7-Zip from using stdcall functions which will get unavoidable decorated names from
+   MSVC's cl.exe which Delphi can't handle: first include windows.h and then hide the
+   functions 7-Zip wants to use with macros pointing to cdecl prototypes. This will enable
+   is us to call the stdcall function from a cdecl implementation in Delphi and keeps the
+   rest of windows.h available to 7-Zip. */
+
+#include "../../../../Components/Lzma2/Util/7z/Precomp.h" /* Says it must be included first */
+#include "../../../../Components/Lzma2/7zWindows.h"
+
+BOOL _CreateDirectoryW(LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
+#define CreateDirectoryW _CreateDirectoryW
+
+HANDLE _CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
+#define CreateFileA _CreateFileA
+
+HANDLE _CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
+#define CreateFileW _CreateFileW
+
+BOOL _FileTimeToLocalFileTime(FILETIME* lpFileTime, LPFILETIME lpLocalFileTime);
+#define FileTimeToLocalFileTime _FileTimeToLocalFileTime
+
+DWORD _GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);
+#define GetFileSize _GetFileSize
+
+BOOL _ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
+#define ReadFile _ReadFile
+
+BOOL _SetFileAttributesW(LPCWSTR lpFileName, DWORD dwFileAttributes);
+#define SetFileAttributesW _SetFileAttributesW
+
+DWORD _SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);
+#define SetFilePointer _SetFilePointer
+
+BOOL _SetFileTime(HANDLE hFile, FILETIME* lpCreationTime, FILETIME* lpLastAccessTime, FILETIME* lpLastWriteTime);
+#define SetFileTime _SetFileTime
+
+BOOL _WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);
+#define WriteFile _WriteFile
+
+BOOL _CloseHandle(HANDLE hObject);
+#define CloseHandle _CloseHandle
+
+DWORD _GetLastError(VOID);
+#define GetLastError _GetLastError
+
+HLOCAL _LocalFree(HLOCAL hMem);
+#define LocalFree _LocalFree
+
+DWORD _FormatMessageA(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPSTR lpBuffer, DWORD nSize, va_list *Arguments);
+#define FormatMessageA _FormatMessageA
+
+int _WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWCH lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar);
+#define WideCharToMultiByte _WideCharToMultiByte
+
+#endif
+
 #include "../../../../Components/Lzma2/Util/7z/7zMain.c"
 
 #include "../../../../Components/Lzma2/7zAlloc.c"

二进制
Projects/Src/Compression.SevenZipDecoder/7zDecode/IS7zDec.obj


+ 1 - 1
README.md

@@ -214,7 +214,7 @@ Compiled by Visual Studio 2022 from the [Projects\Src\Compression.LZMADecompress
 Compiled by Visual Studio 2022 from the [Projects\Src\Compression.LZMA1SmallDecompressor\LzmaDecode] directory.
 
 **Projects\Src\Compression.SevenZipDecoder\7zDecode\IS7zDec.obj** -
-Compiled by Embarcadero C++ 7.30 from the [Projects\Src\Compression.SevenZipDecoder\7zDecode] directory.
+Compiled by Visual Studio 2022 from the [Projects\Src\Compression.SevenZipDecoder\7zDecode] directory.
 
 **Examples\MyProg.exe**, **Examples\MyProg-x64.exe**, **Examples\MyProg-Arm64.exe** -
 Compiled by Visual Studio 2022 from the [Examples\MyProg] directory.