1

我正在将此代码从 C++ 转换为 Delphi,但我没有得到以下代码部分。谁能解释一下以下代码的含义;szBuff 缓冲区发生了什么?

我很确定这是一种格式(替换),但我什至不知道结果是什么,而且我找不到所用函数的任何合理文档(也许我只是一个跛脚:)

任何人都可以帮我将此代码翻译成 Delphi(或指导我查阅适当的文档)吗?

我不喜欢这样你如何自己转换问题,所以我至少在问题标题中提到了函数名称,以便将来可以搜索给其他人。

function TSecInfo.BuildSecurityAttributes(var SecAttrs: TSecurityAttributes): boolean;
var
  pszSidUser: PChar;
  szBuff: array [0..1024] of Char;
begin

// pszSidUser at this time contains user SID like this
// S-1-5-21-1454471165-1004336348-1606980848-5555

// TCHAR szBuff[1024]; // I'm not sure with array [0..1024] of Char;

  _tcscpy(szBuff, _T("D:"));
  _tcscat(szBuff, _T("(A;;GA;;;"));
  _tcscat(szBuff, pszSidUser);
  _tcscat(szBuff, _T(")"));
  _tcscat(szBuff, _T("(A;;GWGR;;;AN)"));
  _tcscat(szBuff, _T("(A;;GWGR;;;WD)"));

...

  _tcscat(szBuff, _T("S:(ML;;NW;;;S-1-16-0)"));

end;

对于那些对链接中的整个代码感兴趣的人,我可以告诉它应该是一个技巧,如何访问网络管道以在上面的 Windows Vista 上以匿名用户的身份进行编写。要阅读整篇文章,请点击此链接

感谢您的时间
问候

4

2 回答 2

2

_tcscpy并且_tcscatTCHARC 标准库函数的宏版本,strcpy用于strcat复制和连接 C 字符串。它们评估为 ANSI 或 Unicode 版本,具体取决于您所针对的项目是否或类型。在我看来,它实际上是 C 代码而不是 C++ 代码。

在 Delphi 中,您只需使用如下字符串变量:

function TSecInfo.BuildSecurityAttributes(var SecAttrs: TSecurityAttributes): boolean;
var
  pszSidUser: PChar;
  Buff: string;
begin
  // pszSidUser at this time contains user SID like this
  // S-1-5-21-1454471165-1004336348-1606980848-5555

  Buff := 'D:(A;;GA;;;'+pszSidUser+')(A;;GWGR;;;AN)(A;;GWGR;;;WD)S:(ML;;NW;;;S-1-16-0)';
  SomeOtherWindowsAPICall(PChar(Buff));    
end;

大概在 C 代码中调用了另一个 Windows API 函数,该函数接收LPCTSTR. C 代码将通过szBuff,但您可以PChar(Buff)像我上面显示的那样简单地通过。

C 代码使用固定长度的缓冲区,因为它没有可用的动态分配的字符串类,如 Delphistringstd::stringC++。像这样的固定长度缓冲区通常会导致缓冲区溢出。如果可以避免,在 Delphi 中不要使用固定长度的缓冲区。

这是一个典型的例子,说明为什么具有内置字符串处理的语言比 C 更容易使用。

于 2011-06-30T17:13:58.083 回答
1

看起来代码正在使用TCHARS,基本上它们是一个宏,它使从 unicode 到非 unicode 更容易。_tcscpy正在将参数复制到szBuff_tcscat正在将参数附加到szBuff。如果您熟悉strcpy并且strcat他们做同样的事情。

_tcscpy(szBuff, _T("D:")); //szBuff == "D:"
_tcscat(szBuff, _T("(A;;GA;;;")); //szBuff == "D:A;;GA;;;"
...
于 2011-06-30T16:58:59.287 回答