我正在寻找一种从64位Delphi应用程序枚举本地网络上的MS SQL Server的方法.到目前为止我在32位上使用的方法工作正常,但包含不能在32位编译的汇编代码.我似乎找不到从64位客户端枚举服务器的方法.
我无法编译的代码是这样的:
function PtCreateADOObject(const ClassID: TGUID): IUnknown;
var
Status: HResult;
FPUControlWord: Word;
begin
asm
FNSTCW FPUControlWord
end;
Status := CoCreateInstance(
CLASS_Recordset,
nil,
CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER,
IUnknown,
Result);
asm
FNCLEX
FLDCW FPUControlWord
end;
OleCheck(Status);
end;
Run Code Online (Sandbox Code Playgroud)
导致您麻烦的代码只是存储和恢复浮点控制状态.你可以用跨平台的方式编写它(好吧,支持x86和x64),如下所示:
type
TFPControlState = {$IFDEF CPUX86}Word{$ENDIF}{$IFDEF CPUX64}UInt32{$ENDIF};
function GetFPControlState: TFPControlState;
begin
{$IFDEF CPUX86}
Result := Get8087CW;
{$ENDIF}
{$IFDEF CPUX64}
Result := GetMXCSR;
{$ENDIF}
end;
procedure SetFPControlState(const Value: TFPControlState);
begin
{$IFDEF CPUX86}
Set8087CW(Value);
{$ENDIF}
{$IFDEF CPUX64}
SetMXCSR(Value);
{$ENDIF}
end;
Run Code Online (Sandbox Code Playgroud)
这抽象出32位代码使用具有16位控制状态的8087单元的事实,64位代码使用具有32位控制状态的SSE单元.
现在您的功能变为:
function PtCreateADOObject(const ClassID: TGUID): IUnknown;
var
Status: HResult;
FPControlState: TFPControlState;
begin
FPControlState := GetFPControlState;
Status := CoCreateInstance(
CLASS_Recordset,
nil,
CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER,
IUnknown,
Result
);
SetFPControlState(FPControlState);
OleCheck(Status);
end;
Run Code Online (Sandbox Code Playgroud)
这种方法有很多好处.最清楚的是:
| 归档时间: |
|
| 查看次数: |
347 次 |
| 最近记录: |