![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL в Delphi [D7, WinXP]
DimOk © (2007-06-27 17:08:00)Столкнулся с такой проблемой: есть DLL в котором находятся функции для работы с PChar. Подключаю DLL динамически к основной программе, получаю адрес необходимой функции и передаю в нее параметр PChar, при отладке в основной программе указан именно тот набор символов, который пользователь вводит, но как только заходим в проект DLL и смотрим там параметр, который передавали то видим совсем другую картину (вводим 123 а получаем Ⱥ}{ÓvF), может кто знает как устранить такую проблему. Буду очень благодарен за любую помощь.
Сергей М. (2007-06-28 12:34:00) [21]
> DimOk © (28.06.07 12:28) [41]
К чему вся эта шелуха ?
Тебе в [34] был задан конкретныйвопрос, ответить на который ты не удосужился, предпочтя вместо этого пустить слезы-сопли по поводу якобы "обсирания".
Ну а раз не соизволил ответить, значит тебя не интересует источник проблемы.
DimOk (2007-06-28 12:28:00) [22]
> Жаль. Пример обращения тебя как автовладельца "больного"
> авто, в котором ты ничерта не смыслишь (но в душе искренне
> желаешь познать), к специалистам автосервиса был бы весьма
> показателен.
Немного о себе: я имею высшее образование, работаю в крупной и преуспевающей конторе уже 3 года, программировал и программирую на С++, VB, FP, 1С а Delphi изучаю всего 1 -ый месяц, все что у меня есть по Delphi так это иллюстрированный самоучитель в электронном виде и ресурсы интернета - сами понимаете, что на работе много не начитаешься (книг бумажных). Поэтому и лезу на форумы для поиска помощи среди знающих людей "МАСТЕРА DELPHI" всем большое спасибо, но видимо этот сайт не для таких как я...
Сергей М. (2007-06-28 12:20:00) [23]Жаль. Пример обращения тебя как автовладельца "больного" авто, в котором ты ничерта не смыслишь (но в душе искренне желаешь познать), к специалистам автосервиса был бы весьма показателен.
DimOk (2007-06-28 12:16:00) [24]
> У тебя автомобиль есть ?
Нет
Сергей М. (2007-06-28 12:12:00) [25]
> DimOk © (28.06.07 11:55) [36]
У тебя автомобиль есть ?
Сергей М. (2007-06-28 12:03:00) [26]
> поппытаю счастья где ни будь в другом месте
Проконсультируйся насчет "другого места" у Ketmar (C) - от точно подскажет, куда тебе идти
DimOk (2007-06-28 11:55:00) [27]
> Хочешь хороший совет - забудь про DLL и PChar
> Это пока не твое.
Пришел за помощью, а вы меня отфутболиваете, зачем тогда этот форум существует? Обсирать новичков? Или давать все же помогать......? Вы сами проверяете свои советы или так из гоовы их бирете.....?Хорошо поппытаю счастья где ни будь в другом месте.
Anatoly Podgoretsky (2007-06-28 11:49:00) [28]Хочешь хороший совет - забудь про DLL и PChar
Это пока не твое.
Сергей М. (2007-06-28 11:41:00) [29]Ну что ты как детский ребенок, ей-богу ?
На какой строчке "пишет" ?
DimOk (2007-06-28 11:34:00) [30]
> TEncrypt = procedure(Buf: PChar; Key: Word); stdcall;
> ..
> var
> Encrypt: TEncrypt;
> tmpstr: String;
> ..
> tmpstr := frmSettingsFilesAndDB.PasswordArc.Text;
> Encrypr(PChar(tmpstr), 135);
> frmSettingsFilesAndDB.PasswordArc.Text := tmpstr;
Пишет Invalid Pointer Operation
Сергей М. (2007-06-28 11:24:00) [31]
> i: byte;
Правильней будет i: Integer
Сергей М. (2007-06-28 11:20:00) [32]в хост-приложении:
TEncrypt = procedure(Buf: PChar; Key: Word); stdcall;
..
var
Encrypt: TEncrypt;
tmpstr: String;
..
tmpstr := frmSettingsFilesAndDB.PasswordArc.Text;
Encrypr(PChar(tmpstr), 135);
frmSettingsFilesAndDB.PasswordArc.Text := tmpstr;
в библиотеке:
procedure Encrypt(Buf: PChar; Key: Word); stdcall;
var
i: byte;
begin
i := 0;
while Buf[i] <> #0 do begin
Buf[i] := char(byte(Buf[i]) xor (Key shr 8));
Key := (byte(Buf[i]) + Key) * C1 + C2;
Inc(i);
end;
end;
DimOk (2007-06-28 10:58:00) [33]
> за основу можно взять прототип CharToOemBuff и сделать так
>
> {Кодирует строку}
> function Encrypt(Src: PChar; Dest:PChar; ScrLen:Integer;
> Key: Word);stdcall;
> var
> I: byte;
> begin
> for I := 0 to SrcLen-1 do begin
> Dest[I] := char(byte(Src[I]) xor (Key shr 8));
> Key := (byte(Result[I]) + Key) * C1 + C2;
> end;
> end;
>
> и использовать так
>
> var
> StrSrc:String;
> StrDest:String;
>
> StrSrc:= frmSettingsFilesAndDB.PasswordArc.Text;
>
> SetLength(StrDest,Length(StrSrc));
>
> Encrypt(Pchar(StrSrc),Pchar(StrDest),Length(StrSrc),135);
>
>
> iniFile.WriteString('ReportSection','PassReport',StrDest);
>
Такая же фигня получается... :(
icWasya (2007-06-28 10:50:00) [34]Ошибочка
вместо
for I := 0 to SrcLen do begin
надо
for I := 0 to SrcLen-1 do begin
DimOk (2007-06-28 10:22:00) [35]
> за основу можно взять прототип CharToOemBuff и сделать так
>
> {Кодирует строку}
> function Encrypt(Src: PChar; Dest:PChar; ScrLen:Integer;
> Key: Word);stdcall;
> var
> I: byte;
> begin
> for I := 0 to SrcLen do begin
> Dest[I] := char(byte(Src[I]) xor (Key shr 8));
> Key := (byte(Result[I]) + Key) * C1 + C2;
> end;
> end;
>
> и использовать так
>
> var
> StrSrc:String;
> StrDest:String;
>
> StrSrc:= frmSettingsFilesAndDB.PasswordArc.Text;
>
> SetLength(StrDest,Length(StrSrc));
>
> Encrypt(Pchar(StrSrc),Pchar(StrDest),Length(StrSrc),135);
>
>
> iniFile.WriteString('ReportSection','PassReport',StrDest);
>
>
Спасибо сейчас ппробую....
icWasya (2007-06-28 10:16:00) [36]за основу можно взять прототип CharToOemBuff и сделать так
{Кодирует строку}
function Encrypt(Src: PChar; Dest:PChar; ScrLen:Integer; Key: Word);stdcall;
var
I: byte;
begin
for I := 0 to SrcLen do begin
Dest[I] := char(byte(Src[I]) xor (Key shr 8));
Key := (byte(Result[I]) + Key) * C1 + C2;
end;
end;
и использовать так
var
StrSrc:String;
StrDest:String;
StrSrc:= frmSettingsFilesAndDB.PasswordArc.Text;
SetLength(StrDest,Length(StrSrc));
Encrypt(Pchar(StrSrc),Pchar(StrDest),Length(StrSrc),135);
iniFile.WriteString('ReportSection','PassReport',StrDest);
Сергей М. (2007-06-28 10:05:00) [37]
> DimOk © (28.06.07 09:59) [23]
> тут все дело с правильным выделением памяти
Не надо тут ничего выделять.
Время жизни строки, возвращаемой обращением к св-ву Text, равно времени исполнения строки, в котором присутствует это обращение.
DimOk (2007-06-28 10:03:00) [38]
> Еще одна допущенная тобой ошибка - индексация элементов
> массива символов, на который ссылается PChar-указатель,
> начинается с нуля а не с единицы.
Это я уже исправил
Сергей М. (2007-06-28 10:01:00) [39]
> DimOk © (28.06.07 09:55) [22]
Еще одна допущенная тобой ошибка - индексация элементов массива символов, на который ссылается PChar-указатель, начинается с нуля а не с единицы.
DimOk (2007-06-28 09:59:00) [40]
> iniFile.WriteString('ReportSection','PassReport', Encrypt(PChar(frmSettingsFilesAndDB.
> PasswordArc.Text),135)));
Нет, я тоже так делал, тут все дело с правильным выделением памяти, я так понял.