powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
11 сообщений из 11, страница 1 из 1
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
    #39560516
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго всем дня!

Уважаемые форумчане, помогите, схожу с ума :(

Есть процедуры в dll:
вот эти
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function Encrypt(const S, Key: WideString): WideString; cdecl; export;
begin
  Result := PGPMine.Encrypt(S, Key);
end;

function Decrypt(const S, Key: WideString): WideString; cdecl; export;
begin
  Result := PGPMine.Decrypt(S, Key);
end;

exports
  Encrypt,
  Decrypt;

//преобразуют текст в строки вида 551902D0B5297165D09F761F1DD0B3 и обратно



Есть тестовый проект, в котором "ширфуется" и "дешифруется" текст, и это работает:
вот так тестировал
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
function Encrypt(const S, Key: WideString): WideString; stdcall; external 'pgpcd.dll';
function Decrypt(const S, Key: WideString): WideString; stdcall; external 'pgpcd.dll';

implementation

...

procedure TForm1.Button1Click(Sender: TObject);
var S: String;
begin
  S := Edit2.Text;
  S := Encrypt(Memo1.Lines.Text, S);
  Edit3.Text := S;

  S := Edit2.Text;
  S := Decrypt(Edit3.Text, S);
  Memo2.Lines.Text := S;

  //тут все ок
end;



а вот так сделано в рабочем проекте:
вот так вот
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  glVarCon, glServer, glPath, glUser, glPass, glProtocol, glPort: String;

function Encrypt(const S, Key: WideString): WideString; stdcall; external 'pgpcd.dll';
function Decrypt(const S, Key: WideString): WideString; stdcall; external 'pgpcd.dll';

...

  glPass := MyINI.ReadString('DB'+glVarCon, 'Pass', ''); //читает правильную строку
  glPass := Decrypt(glPass, 'KEY34NAS'); //тут приходит пустая строка '' :( "ключ" правильный
  if glPass = '' then glPass := 'masterkey';



Подскажите, почему может работать в тестовом и не работать там где нужно?

Спасибо!
...
Рейтинг: 0 / 0
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
    #39560527
Фотография Virtual Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
function Encrypt(const S, Key: WideString): WideString; cdecl; export;
function Decrypt(const S, Key: WideString): WideString; cdecl; export;

function Encrypt(const S, Key: WideString): WideString; stdcall; external 'pgpcd.dll';
function Decrypt(const S, Key: WideString): WideString; stdcall; external 'pgpcd.dll';


Может в stdcall и cdecl дело?
...
Рейтинг: 0 / 0
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
    #39560535
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
    #39560539
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Virtual Student, благодарю за отзыв!

Это косяк ) исправил на cdecl, но так же: тестовое работает, рабочее нет
...
Рейтинг: 0 / 0
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
    #39560542
Фотография Virtual Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio,
Тогда попробуйте посмотреть в сторону менеджера строк: ShareMem
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }
...
Рейтинг: 0 / 0
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
    #39560551
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Virtual Student, для широких стринг он ни к чему

Devillio, использовать отладчик не предлагать?
...
Рейтинг: 0 / 0
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
    #39560703
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00chVirtual Student, для широких стринг он ни к чему
Да ну. Это такой же автоматический тип, как и "узкий стринг", и требует общего менеджера памяти.
...
Рейтинг: 0 / 0
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
    #39560724
Василий №2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Память под WideString управляется системой, так что ShareMem не нужен. Тем не менее, передавать delphi-specific типы в/из DLL считается плохим тоном и малопортабельной практикой. Общие приемы передачи областей памяти туда-сюда стоит взять из Winapi:
1) Кто выделяет - тот и удаляет
2) Передача в DLL указателей и отдельно размера буфера либо 0-завершаемых строк
3) Возврат из DLL длины записанных данных либо 0-завершаемых строк
3.1) Для непредсказуемой длины результирующих данных при buf=null возвращать только требуемый размер буфера без реальной записи данных
...
Рейтинг: 0 / 0
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
    #39560729
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockДа ну. Это такой же автоматический тип, как и "узкий стринг", и требует общего менеджера памяти.
Нет, WideString это системная строка ( BSTR ).
...
Рейтинг: 0 / 0
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
    #39560734
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockfd00chVirtual Student, для широких стринг он ни к чему
Да ну. Это такой же автоматический тип, как и "узкий стринг", и требует общего менеджера памяти.
Да, наверно я неправ.
...
Рейтинг: 0 / 0
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
    #39560735
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillioисправил на cdecl, но так же: тестовое работает, рабочее нет
А можно полюбопытствовать: не работает - это выводит ошибку с пустым текстом?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]