Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении / 11 сообщений из 11, страница 1 из 1
28.11.2017, 13:16:59
    #39560516
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
Доброго всем дня!

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

Есть процедуры в 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
28.11.2017, 13:23:50
    #39560527
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
Код: 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
28.11.2017, 13:32:41
    #39560535
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
...
Рейтинг: 0 / 0
28.11.2017, 13:35:37
    #39560539
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
Virtual Student, благодарю за отзыв!

Это косяк ) исправил на cdecl, но так же: тестовое работает, рабочее нет
...
Рейтинг: 0 / 0
28.11.2017, 13:39:22
    #39560542
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
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
28.11.2017, 14:02:04
    #39560551
fd00ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры из dll работает в тестовом, но не работает в рабочем приложении
Virtual Student, для широких стринг он ни к чему

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


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