![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Тип, совместимый и со String и с PChar [D6, 95/98]
Dr. Genius © (2006-10-21 08:04:00)Здравствуйте!
String можно преобразовать в PChar, PChar можно преобразовать в String. А существует ли в Delphi такой тип, совместимый и со String и с PChar без дополнительного преобразования? Мне в частности надо как-то объявить в качестве аргумента функци строку, совместимую с обоими из вышеперечисленных типов (чтобы не было ошибок “Incompatible types: ‘String’ and ‘PChar’”).
Ketmar (2006-10-26 15:46:00) [1]>[21] Gloomer(c) 26-Oct-2006, 15:45
да тут вообще подход в корне неверный. например -- автор твёрдо уверен, что после "шифрования" в строках типа PChar не появится #0 посерёдке? %-)
Gloomer (2006-10-26 15:45:00) [2]>[20] Ketmar © (26.10.06 14:30)ну надо же на чем-то учиться...
ИМХО без парсера действительно будет трудно обойтись.
К тому же интересно, как Dr. Genius определяет, что это именно строковая переменная - по одинарным кавычкам? Тогда он забыл еще про некоторые типы переменных, например Char, array of char...
Ketmar (2006-10-26 14:30:00) [3]>[19] Плохиш(c) 26-Oct-2006, 14:03
>сохраняй описания и в нужном месте проверяй по списку тип.
так это ж парзер писать надо. давайте лучше помолчим. а то появится ещё одна ветка, где будут вопросы о парзере. а автору ещё рановато это делать...
Плохиш (2006-10-26 14:03:00) [4]
> Dr. Genius (26.10.06 08:10) [15]
>
> > Почему бы ей не возвращать string, когда заменяет параметр
>
> > string и PChar, когда заменяет параметр PChar?
>
>
> А как тогда узнать, какой параметр заменяется?
Делфи - это такой язык, в котором все переменные/параметры должны быть описаны до использования. Соответственно сохраняй описания и в нужном месте проверяй по списку тип.
Плохиш (2006-10-26 13:44:00) [5]
> (чтобы exe-файл программы после компиляции не содержал строк
> в открытом виде)
Может попробовать писать строки без использования нецензурного сленга, тогда и шифровать ничего не придётся.
Джо (2006-10-26 12:13:00) [6]> [15] Dr. Genius (26.10.06 08:10)
> А как тогда узнать, какой параметр заменяется?
Ну ты же их заменяешь, кому знать, как не тебе?
Сергей М. (2006-10-26 10:54:00) [7]
> Dr. Genius (25.10.06 19:37) [11]
> для защиты строк в исходникахDelphi
А причем здесь EXE ?
Dr. Genius (2006-10-26 08:10:00) [8]
> Почему бы ей не возвращать string, когда заменяет параметр
> string и PChar, когда заменяет параметр PChar?
А как тогда узнать, какой параметр заменяется?
Джо (2006-10-25 19:52:00) [9]> Так вот, эта функция естественно возвращает значение типа
> String.
Почему бы ей не возвращать string, когда заменяет параметр string и PChar, когда заменяет параметр PChar?
Anatoly Podgoretsky (2006-10-25 19:51:00) [10]В файле *.pas нет никаких PChar строк.
Loginov Dmitry (2006-10-25 19:51:00) [11]Dr. Genius (25.10.06 19:37) [11]
Брррредддд!
Dr. Genius (2006-10-25 19:37:00) [12]В общем, я пишу программу для защиты строк в исходниках Delphi (наподобие Delphi String Protect, если кто знает). Вкратце принцип работы программы такой: сканируется файл *.pas на наличие в нем строк; далее эти строки заменяются вызовом функции с определенными параметрами для каждой конкретной строки (чтобы exe-файл программы после компиляции не содержал строк в открытом виде). Так вот, эта функция естественно возвращает значение типа String. Поэтому при обработке файла *.pas, если встречаются строки типа PChar, то на их месте ставится эта ф-ия, возвращающая String. Неизбежно возникают ошибки о несовместимости типов (String и PChar). Можно ли избежать этих ошибок?
Gero (2006-10-22 15:25:00) [13]Автор, ты сам хоть знаешь чего хочешь?
Напиши конкретно, зачем тебе это надо, можешь даже код выложить. Если, конечно, он не маркирован грифом «Совершенно секретно».
@!!ex (2006-10-22 14:28:00) [14]
> Dr. Genius
походу это вы чего то не так понимаете. ;)
sniknik (2006-10-22 14:17:00) [15]> По-моему меня не так поняли.
поняли правильно, именно так как написано
даже в уточнении
> Как объявить string-переменную в качестве параметра функции так ...
продолжаешь, хотя в примере скорее угадывается вопрос "как передать в функцию с параметром типа PChar переменную типа string"...
Ketmar (2006-10-22 13:31:00) [16]чукча не читатель?
Dr. Genius (2006-10-22 13:27:00) [17]По-моему меня не так поняли.
Как объявить string-переменную в качестве параметра функции так, чтобы не возникало ошибок о несовместимости типов, независимо от того, параметр какого типа (string или PChar) требуется этой функции.
var
S: string;
begin
S := 'open';
ShellExecute(Form1.Handle, ProcessString(S), 'C:\...', nil, nil, SW_SHOW);
Вариант, предложенный @!!ex не подходит. При выполнении выложенного мной кода возникает ошибка: Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'PChar'.
@!!ex (2006-10-22 10:06:00) [18]
> Dr. Genius (21.10.06 08:04)
Как тут уже сказали - overload не плохое решение.
Но я почемуто предполагаю, что вы не знаете что это....
Procedure ProcessString(S:PChar); overload;
Procedure ProcessString(S:String); overload;
....
Procedure ProcessString(S:PChar);
begin
ProcessString(string(S));
end;
Procedure ProcessString(S:String);
begin
end;
Вариант Джо - тоже вариант.
Джо (2006-10-21 19:28:00) [19]
procedure ShowMe (const{или var} S);
begin
ShowMessage (string(S))
end;
:)
Desdechado (2006-10-21 19:14:00) [20]Variant