Как конвертировать C ++ _tcscpy, _tcscat в Delphi? - PullRequest
1 голос
/ 30 июня 2011

Я конвертирую этот код из 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 выше. По всей статье следуйте этой ссылке .

Спасибо за ваше время
Привет

Ответы [ 2 ]

2 голосов
/ 30 июня 2011

_tcscpy и _tcscat являются TCHAR макро версиями функций стандартной библиотеки C 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 использует буфер фиксированной длины, потому что он не имеет динамически размещаемого строкового класса, такого какDelphi string или std::string в C ++.Подобные буферы фиксированной длины часто приводят к переполнению буфера.В Delphi не используйте буфер фиксированной длины, если вы можете его избежать.

Это классический пример того, почему с языками со встроенной обработкой строк работать намного проще, чем с C.

1 голос
/ 30 июня 2011

Похоже, что код использует TCHARS , в основном это макрос, который облегчает переход от unicode к non-unicode._tcscpy копирует параметр в szBuff, _tcscat добавляет параметр в szBuff.Если вы знакомы с strcpy и strcat, они делают то же самое.

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