Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DLL в Delphi [D7, WinXP]


Страницы:   1 2 3 4

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)));

Нет, я тоже так делал, тут все дело с правильным выделением памяти, я так понял.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо