【问题标题】:How do I get rid of "W1047 Unsafe code '@ operator'" in this RaiseExeption call如何在此引发异常调用中摆脱“W1047 不安全代码'@操作'”
【发布时间】:2017-04-19 07:52:55
【问题描述】:

Delphi 2007 中的以下代码给了我警告

W1047 不安全代码 '@operator'

在将@ThreadNameInfo 传递给 RaiseException 的行中:

procedure SetThreadName(const _Name: AnsiString);
var
  ThreadNameInfo: TThreadNameInfo;
begin
  ThreadNameInfo.FType := $1000;
  ThreadNameInfo.FName := PAnsiChar(_Name);
  ThreadNameInfo.FThreadID := $FFFFFFFF;
  ThreadNameInfo.FFlags := 0;
  try
    RaiseException($406D1388, 0, SizeOf(ThreadNameInfo) div SizeOf(LongWord),
      @ThreadNameInfo); // --> Here
  except
    // ignore
  end;
end;

除了禁用“不安全代码”的编译器警告之外,还有其他方法可以消除此警告吗?既然 Delphi 不再支持 dotNET,这个警告还有意义吗?

我尝试将参数显式类型转换为 PDWord(最后一个参数的声明类型),这并没有改变任何东西。

【问题讨论】:

  • Addr(ThreadNameInfo) 工作吗?
  • @LURD Addr@ 完全可以互换,除了受$TYPEDADDRESS 的影响之外。具体来说,Addr 是一个返回 Pointer 的内在函数。另一方面,$TYPEDADDRESS ON 然后@ 产生一个类型化的指针。结论,Addr() 也会导致发出警告。

标签: delphi delphi-2007


【解决方案1】:

此警告适用于将由 .net 编译器编译的代码。如果您不使用 Delphi .net 编译器,您可以而且应该取消该特定警告。

【讨论】:

    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多