gpt4 book ai didi

sql-server - 如何从 64 位客户端应用程序枚举 MSSQL Server?

转载 作者:行者123 更新时间:2023-12-03 15:22:06 25 4
gpt4 key购买 nike

我正在寻找一种从 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;

最佳答案

给您带来麻烦的代码只是存储和恢复浮点控制状态。您可以以跨平台的方式编写它(嗯,支持 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;

这抽象了这样一个事实:32 位代码使用 8087 单元及其 16 位控制状态,64 位代码使用 SSE 单元及其 32 位控制状态。

现在你的函数变成了:

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;

这种方法有很多好处。最清楚的是:

  1. 您完全避免使用汇编代码。
  2. 您可以使用标准 RTL 单元来操作浮点控制状态。
  3. 您将条件代码限制在低级例程中。高级例程可能仍然不了解该细节,您可以在高级的不同位置重复使用此方法,而不会受到条件的污染。

关于sql-server - 如何从 64 位客户端应用程序枚举 MSSQL Server?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24449475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com