【问题标题】:How do you convert C++ _tcscpy, _tcscat to Delphi?如何将 C++ _tcscpy、_tcscat 转换为 Delphi?
【发布时间】:2011-06-30 16:47:16
【问题描述】:

我正在将 this code 从 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 上以匿名用户身份进行编写。全文请关注this link

感谢您的宝贵时间
问候

【问题讨论】:

  • 你确定是c++吗?不像
  • @VJo - 不;一定不;但源代码文件具有 *.cpp 扩展名和库链接,如 #include <windows.h>
  • @VJo:链接后面的原始代码是C++。
  • szBuff[1024] 表示有 1024 个元素。 array [0..1024] 是 1025 个元素。你需要array[0..1024 - 1],有时写成array[0..1023]
  • 如果我没看错的话,示例代码还使用了“Shlemiel the Painter”的字符串连接 (joelonsoftware.com/articles/fog0000000319.html)

标签: c++ delphi string code-conversion


【解决方案1】:

_tcscpy_tcscat 是 C 标准库函数 strcpystrcatTCHAR 宏版本,用于复制和连接 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 代码中调用了另一个接收LPCTSTR 的 Windows API 函数。 C 代码将传递szBuff,但您可以简单地传递PChar(Buff),如上所示。

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

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

【讨论】:

  • +1 并接受。感谢您的解释;是的 ConvertStringSecurityDescriptorToSecurityDescriptor 在这之后被调用,我将使用你的建议。
  • 上帝保佑 Delphi 中的这种动态分配 :) C 代码在我看来仍然像洒了的茶。
  • @daemon_x 如果 C 代码放弃对双 ANSI/Unicode 构建的支持会好很多,如果是 C++ 并使用 std::wstring 会更好。
【解决方案2】:

看起来代码正在使用TCHARS,基本上它们是一个宏,可以更轻松地从 unicode 转换为非 unicode。 _tcscpy 将参数复制到szBuff_tcscat 将参数附加到szBuff。如果您熟悉strcpystrcat,他们会做同样的事情。

_tcscpy(szBuff, _T("D:")); //szBuff == "D:"
_tcscat(szBuff, _T("(A;;GA;;;")); //szBuff == "D:A;;GA;;;"
...

【讨论】:

  • 谢谢;所以这意味着strcat 的后续调用仅将所有这些字符串连接在一起,并且它可能用于代码更具可读性?没有特殊字符吗?
  • 是的,没错。 _T("string") 也将是 "string" 不带 UNICODE 或将是 L"string" 带 UNICODE。
猜你喜欢
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
相关资源
最近更新 更多