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および_tcscatTCHAR、C 標準ライブラリ関数のマクロ バージョンであり、C 文字列のコピーおよび連結用ですstrcpystrcat対象となるプロジェクトのタイプに応じて、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. C コードはパスしますが、上記のようにszBuff単純にパスできます。PChar(Buff)

stringC コードは、Delphiやstd::stringC++のような動的に割り当てられた文字列クラスを使用できないため、固定長バッファを使用しています。このような固定長のバッファーは、多くの場合、バッファー オーバーランを引き起こします。Delphi では、回避できる場合は固定長バッファを使用しないでください。

これは、組み込みの文字列処理を備えた言語が C よりもはるかに使いやすい理由の典型的な例です。

于 2011-06-30T17:13:58.083 に答える
1

コードはTCHARSを使用しているように見えますが、基本的にはユニコードから非ユニコードへの移行を容易にするマクロです。_tcscpyにパラメータをコピーしています。パラメータをszBuff_tcscat追加していますszBuff。あなたがよく知っていてstrcpystrcat彼らが同じことをしているなら。

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