谢谢大家。我有它,因为我是初学者,我对$IfNDef Compiler Directive感到不舒服。我使用了Ken Whites 的代码(如何检查 delphi 操作系统版本?Windows 7 或 Server 2008 R2?)用于 Windows 检测和Remy Lebeau 示例(系统目录中的资源保存)。它在Delphi XE2中完美运行。我的代码如下:
unit ApplicationWizard01;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons;
type
TMainForm = class(TForm)
BitBtn01: TBitBtn;
procedure BitBtn01Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
var
GetNativeSystemInfo: function(var SysInfo: TSystemInfo): BOOL stdcall = nil;
var
GetProductInfo: function (dwOSMajorVersion, dwOSMinorVersion,
dwSpMajorVersion, dwSpMinorVersion: DWORD;
var pdwReturnedProductType: DWORD): BOOL stdcall = nil;
implementation
{$R *.dfm}
function GetSysDir: string;
var
SystemDirectory: array[0..MAX_PATH] of Char;
begin
GetSystemDirectory(SystemDirectory, MAX_PATH - 1);
SetLength(Result, StrLen(SystemDirectory));
Result := IncludeTrailingPathDelimiter(SystemDirectory);
end;
function GetSysNativeDir: string;
var
WindowsDirectory: array[0..MAX_PATH] of Char;
begin
GetWindowsDirectory(WindowsDirectory, MAX_PATH - 1);
SetLength(Result, StrLen(WindowsDirectory));
Result := IncludeTrailingPathDelimiter(WindowsDirectory) + 'Sysnative\';
end;
procedure TMainForm.BitBtn01Click(Sender: TObject);
var
NTBres, BRes: Boolean;
OSVI: TOSVERSIONINFO;
OSVI_NT: TOSVERSIONINFOEX;
SI: TSystemInfo;
ResStream: TResourceStream;
ResourceSavingPathAndFileName : string;
begin
NTBRes := false;
try
OSVI_NT.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFOEX);
NTBRes := GetVersionEx(OSVI_NT);
OSVI.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
BRes := GetVersionEx(OSVI);
except
OSVI.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
BRes := GetVersionEx(OSVI);
end;
if (not BRes) and (not NTBres) then Exit;
Move( OSVI, OSVI_NT, SizeOf(TOSVersionInfo) );
if Assigned(GetNativeSystemInfo) then GetNativeSystemInfo(SI) else GetSystemInfo(SI);
if (SI.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL) then
begin
ResourceSavingPathAndFileName := (GetSysDir);
ResStream := TResourceStream.Create(HInstance, 'DynamicLlinkLibraryWin32', RT_RCDATA);
try
ResStream.SaveToFile(ResourceSavingPathAndFileName + 'FileWin32.dll');
finally
ResStream.Free;
end;
end
else if (SI.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64) then
begin
ResourceSavingPathAndFileName := (GetSysNativeDir);
ResStream := TResourceStream.Create(HInstance, 'DynamicLlinkLibraryWin64', RT_RCDATA);
try
ResStream.SaveToFile(ResourceSavingPathAndFileName + 'FileWin64.dll');
finally
ResStream.Free;
end;
end;
ShowMessage ('Resource Has Been Saved Successfully');
end;
initialization
@GetProductInfo := GetProcAddress(GetModuleHandle('KERNEL32.DLL'),
'GetProductInfo');
@GetNativeSystemInfo := GetProcAddress(GetModuleHandle('KERNEL32.DLL'),
'GetNativeSystemInfo');
end.