如何转换C++_tcscpy,tcscat到德尔福? 我正在从C++到Delphi进行转换,但是我没有得到代码的以下部分。有人能解释一下下面的代码是什么意思吗;szBuff缓冲区发生了什么变化?

如何转换C++_tcscpy,tcscat到德尔福? 我正在从C++到Delphi进行转换,但是我没有得到代码的以下部分。有人能解释一下下面的代码是什么意思吗;szBuff缓冲区发生了什么变化?,c++,delphi,string,code-conversion,C++,Delphi,String,Code Conversion,我很确定这是一种格式(替换),但我甚至不知道结果会是什么,我也找不到任何关于所用函数的合理文档(也许我只是个跛脚的:) 有人能帮我把这段代码翻译成Delphi吗(或者直接告诉我正确的文档) 我不喜欢这样,我自己怎么转换这类问题,所以我在问题标题中至少提到了函数名,以便将来可以搜索到其他人 function TSecInfo.BuildSecurityAttributes(var SecAttrs: TSecurityAttributes): boolean; var pszSidUser:

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

有人能帮我把这段代码翻译成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;
对于那些对链接中的全部代码感兴趣的人来说,我可以告诉他们如何访问网络管道以在上面的WindowsVista上以匿名用户身份进行写作应该是一个技巧。全文如下。

感谢您抽出时间

关于

代码似乎正在使用,基本上它们是一个宏,使从unicode到非unicode变得更容易<代码>\u tcscpy正在将参数复制到
szBuff
\u tcscat
正在将参数附加到
szBuff
。如果您熟悉strcpy和strcat,它们也会做同样的事情

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

\u tcscpy
\u tcscat
是用于复制和连接C字符串的C标准库函数
strcpy
strcat
的宏版本。根据目标项目的类型或类型,它们评估为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代码使用固定长度的缓冲区,因为它没有可用的动态分配的字符串类,如Delphi的代码>字符串或STD::String C++。这样的固定长度缓冲区通常会导致缓冲区溢出。在Delphi中,如果可以避免,请不要使用固定长度的缓冲区


<>这是一个经典例子,说明为什么内置的字符串处理语言比C.</P>更容易使用,你确定它是C++吗?看起来不像like@VJo-没有;当然不是;但是源代码文件具有*.CPP扩展和库链接,如“代码> >包含< /代码> @ VJO:链接后面的原始代码是C++。<代码> SZBuff[1024 ] < /COD>意味着有1024个元素。代码>数组[0..1024]是1025个元素。您需要
array[0..1024-1]
,有时编写
array[0..1023]
。如果我读得正确,示例代码还使用“Shlemiel the Painter”字符串连接()谢谢;这意味着后续的调用只会将所有这些字符串连接在一起,这可能是为了使代码更可读?没有任何特殊字符吗?是的,这是正确的。而且
\t(“字符串”)
将是
“字符串”
w/o UNICODE或
L”字符串“
使用UNICODE.+1并接受。谢谢你的解释;是的,在这里我将使用您所建议的。上帝祝福Delphi中的动态分配:C代码仍然像溢出的Posix一样寻找我。@ DaEnnOxx如果删除支持双ANSI/Unicode构建,C代码会更好,如果它是C++,使用的是代码> STD::WScGe< /Code >。