Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2012, 10:52   #1
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
Вопрос Транслировал код с C++, где ошибся?

Доброго времени суток.
Транслировал код с C++ на Delphi, где ошибся?

C++:
Код:
LPTSTR szCurrentTicks = new TCHAR[0x007F];
DWORD dwCurrentTicks = GetTickCount();
srand(dwCurrentTicks);
DWORD dwRandomValue = (rand() << 16) + rand();
wsprintf ( szCurrentTicks, TEXT("%08X%08X%08X"), dwRandomValue, dwRandomValue ^ dwCurrentTicks, (rand() << 16) + GetCurrentProcessId());
SetEnvironmentVariable(TEXT("__lameLauncher__"), szCurrentTicks);
Delphi:
Код:
    var
       dwCurrentTicks,dwRandomValue:Word;
       param:array[0..5] of integer;
       szMessage: PChar;

    dwCurrentTicks:=GetTickCount;
    dwRandomValue:=(dwCurrentTicks+Random(1000)) Shl 16;
    dwRandomValue:=dwRandomValue+(dwCurrentTicks+Random(1000));
    param[0]:=dwRandomValue;
    param[1]:=dwRandomValue Xor dwCurrentTicks;
    param[2]:=((dwCurrentTicks+Random(1000)) Shl 16) + GetCurrentProcessId();
    GetMem( szMessage, 1024 );
    szMessage:=PChar(IntToStr(dwCurrentTicks));
    wvsprintf(szMessage, PChar('%08X%08X%08X'),@param);
    SetEnvironmentVariable(PChar('__lameLauncher__'), PChar(IntToStr(dwCurrentTicks)));
Этот код требует выполнять разработчик надстройки на софт который я запускаю, но он дал его в c++ в котором я практически не шарю, инфу по каждой строчке пришлось отдельно искать и разбираться что, как и зачем она делает.
Подскажите пожалуйста где ошибся.

Последний раз редактировалось Crystallon; 09.05.2012 в 11:35.
Crystallon вне форума Ответить с цитированием
Старый 09.05.2012, 16:12   #2
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Ваш сишник работает с ANSI, а не с юникодом, так что осторожнее. Вот код:
Код:
const
  RAND_MAX=32768;
var
  dwCurrentTicks:Cardinal;
  dwRandomValue:Cardinal;
  szCurrentTicks:AnsiString;
begin
  SetLength(szCurrentTicks,$7F);
  dwCurrentTicks:=GetTickCount;
  RandSeed:=dwCurrentTicks;
  dwRandomValue:=(Random(RAND_MAX) shl 16)+Random(RAND_MAX);
  wsprintfA(PAnsiChar(szCurrentTicks),PAnsiChar('%08X%08X%08X'));//???
  SetEnvironmentVariableA('__lameLauncher__',PAnsiChar(szCurrentTicks));
end;
По поводу красной строчки ткните своему сишнику на вот это:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Сказано ведь не использовать эту функцию. Честно, сам не разобрался как передать в нее все эти аргументы, которые сишник ваш там перечислил. Насколько я понял, все пихать вторым параметром с разделителем #0 с преобразованием PAnsiChar. Уточните у него, либо договоритесь о другом механизме.

P.S. И вообще, MSDN в помощь, там все расписано, от типов до функций с описанием параметров:
http://msdn.microsoft.com/library/
"ковыряю изнутри" (с)

Последний раз редактировалось 3D Hunter; 09.05.2012 в 16:15.
3D Hunter вне форума Ответить с цитированием
Старый 09.05.2012, 16:15   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

не припомню чтоб Delphi поддерживала переменное число параметров.

вообще проще заменить на Дельфийское Format.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.05.2012, 02:08   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Строчки:

Код:
wsprintf ( szCurrentTicks, TEXT("%08X%08X%08X"), dwRandomValue, dwRandomValue ^ dwCurrentTicks, (rand() << 16) + GetCurrentProcessId());
SetEnvironmentVariable(TEXT("__lameLauncher__"), szCurrentTicks);
Заменяем на:

Код:
var
  szCurrentTicks: String;
...
  szCurrentTicks := Format('%8x%8x%8x%8x', [dwRandomValue, dwRandomValue or dwCurrentTicks, (Random() shl 16) + GetCurrentProcessId]);
  SetEnvironmentVariable('__lameLauncher__', PChar(szCurrentTicks));
Только выражение с Random надо уточнить. Нет Delphi под рукой, чтобы проверить.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 10.05.2012, 02:31   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

GunSmoker, random нужно писать, как указал 3D Hunter:
Random(RAND_MAX) shl 16
и команда ^ это xor, а не or.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 10.05.2012 в 02:34.
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с циклом ( находим сумму) - не могу понять , где ошибся ) zipo666 Помощь студентам 3 01.11.2011 12:51
В чем я ошибся? FindComponent zotox Помощь студентам 5 29.09.2009 02:27
Объясните пожалуйста, где и как ошибся Manchester Паскаль, Turbo Pascal, PascalABC.NET 10 09.02.2009 20:51
Не разберу где ошибся, по моему много напутал Forro Паскаль, Turbo Pascal, PascalABC.NET 6 14.01.2008 14:19
ошибся с областью видимости ? Иванчо Общие вопросы Delphi 8 25.10.2007 16:35