Lazarus 1.6.4 и библиотеки ВербаOW

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Lazarus 1.6.4 и библиотеки ВербаOW

Сообщение bormant » 10.08.2017 20:51:07

Лекс Айрин писал(а):выделяется в куче адрес, а потом по нему выкладывается строка

Никаких куч для литералов.
Код: Выделить всё
{$mode ObjFPC}{$H+}
begin
  WriteLn(PChar('F:'))
end.

Код: Выделить всё
_DATA      SEGMENT   DWORD PUBLIC USE32 'DATA'
   ALIGN 4
_$PROGRAM$_Ld1      DB   "F:",0
_DATA      ENDS


Добавлено спустя 7 минут 27 секунд:
FPC 3.0.2:
Код: Выделить всё
{$mode ObjFPC}{$H+}
procedure InitKey(key_dev: PChar; key_ID: PChar); stdcall;
begin
  WriteLn(key_dev);
end;
begin
  InitKey(PChar('F:'), 'SomeID');
end.

Код: Выделить всё
_CODE      SEGMENT   PARA PUBLIC USE32 'CODE'
   ALIGN 16
   PUBLIC   PASCALMAIN
PASCALMAIN:
   PUBLIC   _main
_main:
   ...
; [7] InitKey(PChar('F:'), 'SomeID');
      mov   eax,offset _$PROGRAM$_Ld1
      push   eax
      mov   eax,offset _$PROGRAM$_Ld2
      push   eax
      call   P$PROGRAM_$$_INITKEY$PCHAR$PCHAR
   ...
_CODE      ENDS
Код: Выделить всё
_DATA      SEGMENT   DWORD PUBLIC USE32 'DATA'
   ALIGN 4
_$PROGRAM$_Ld1      DB   "SomeID",0
_DATA      ENDS

_DATA      SEGMENT   DWORD PUBLIC USE32 'DATA'
   ALIGN 4
_$PROGRAM$_Ld2      DB   "F:",0
_DATA      ENDS


Добавлено спустя 22 минуты 52 секунды:
Код: Выделить всё
{$mode ObjFPC}{$H+}
procedure InitKey(key_dev: PChar; key_ID: PChar); stdcall; external 'a.dll' name 'InitKey';
var s: String;
begin
  s:='SomeID';
  InitKey('F:\', PChar(s));
end.


FPC 3.0.2:
Код: Выделить всё
   EXTRN   FPC_EMPTYCHAR: NEAR
   EXTRN   _$dll$a$InitKey: NEAR

_CODE      SEGMENT   PARA PUBLIC USE32 'CODE'
   ALIGN 16
   PUBLIC   PASCALMAIN
PASCALMAIN:
   PUBLIC   _main
_main:
   ...
; [5] s:='SomeID';
      mov   eax,offset _$PROGRAM$_Ld1
      mov   edx,eax
      mov   eax,offset U_$P$PROGRAM_$$_S
      call   fpc_ansistr_assign
; [6] InitKey('F:\', PChar(s));
      mov   eax,dword ptr [U_$P$PROGRAM_$$_S]
      test   eax,eax
      jne   @@j13
      mov   eax,offset FPC_EMPTYCHAR
@@j13:
      push   eax
      mov   eax,offset _$PROGRAM$_Ld2
      push   eax
      call   _$dll$a$InitKey
   ...
_CODE      ENDS
Код: Выделить всё
_BSS      SEGMENT   DWORD PUBLIC USE32 'BSS'
   ALIGN 4
U_$P$PROGRAM_$$_S   DB   4 DUP(?)
_BSS      ENDS

_DATA      SEGMENT   DWORD PUBLIC USE32 'DATA'
   ALIGN 4
   DW   0,1
   DD   -1,6
_$PROGRAM$_Ld1      DB   "SomeID",0
_DATA      ENDS

_DATA      SEGMENT   DWORD PUBLIC USE32 'DATA'
   ALIGN 4
_$PROGRAM$_Ld2      DB   "F:\",0
_DATA      ENDS
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Lazarus 1.6.4 и библиотеки ВербаOW

Сообщение gvido » 10.08.2017 21:46:31

bormant писал(а):Добавлено спустя 22 минуты 52 секунды:Код: Выделить всё{$mode ObjFPC}{$H+}procedure InitKey(key_dev: PChar; key_ID: PChar); stdcall; external 'a.dll' name 'InitKey';var s: String;begin s:='SomeID'; InitKey('F:\', PChar(s));end

Я так понимаю что a.dll создана в лзарус с fpc 3.0.2? Вполне может быть, что в этом случае грабли с передачей параметров из приложения в функцию dll выпрямляются в dll. То есть срабатывает некая взаимная компенсация, так сказать...

Возможно я не прав. Возможно в C dll есть какие-то ошибки не учтенные разработчиком, которые проявились только сейчас.
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Re: Lazarus 1.6.4 и библиотеки ВербаOW

Сообщение bormant » 10.08.2017 22:15:51

gvido,
a.dll отсутствует. Ее наличие для компиляции не требуется. Поскольку вся необходимая информация есть в исходнике, компилятор и линковщик в состоянии построить исполняемый файл, содержащий код загрузки указанной библиотеки при запуске исполняемого файла.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Lazarus 1.6.4 и библиотеки ВербаOW

Сообщение gvido » 10.08.2017 22:21:31

Завтра попрошу, коллегу собрать на С dll c выводом входящих параметров в текстовый файл.
По другому, похоже, никак.
Чудес то не бывает. Где-то есть косяк и его нужно найти. А потом уже думать как выкручиваться.
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Re: Lazarus 1.6.4 и библиотеки ВербаOW

Сообщение bormant » 10.08.2017 22:27:05

FPC-шная библиотека аномалий не обнаруживает:
Код: Выделить всё
{$mode ObjFPC}{$H+}
library a;
procedure InitKey(key_dev: PChar; key_ID: PChar); stdcall;
begin
  WriteLn('key_dev: ',key_dev);
  WriteLn('key_ID: ',key_ID);
end;
exports
  InitKey;
end.


Добавлено спустя 57 секунд:
Код: Выделить всё
key_dev: F:
key_ID: SomeID


Добавлено спустя 8 минут 53 секунды:
Ежели нет доверия WriteLn, можно и так вывести:
Код: Выделить всё
{$mode ObjFPC}{$H+}
library a;
procedure InitKey(key_dev, key_ID: Pointer); stdcall;
  procedure show(p: PChar);
  begin
    if p<>nil then begin
      while p^<>#0 do begin Write(p^); Inc(p); end; WriteLn;
    end;
  end;
begin
  show(key_dev); show(key_ID);
end;
exports
  InitKey;
end.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Lazarus 1.6.4 и библиотеки ВербаOW

Сообщение gvido » 10.08.2017 22:54:57

Что-то изменилось в связке лазарус и фпс начиная с 1.4.4. Я хочу понять что и как это обойти или исправить. Библиотеке 12 лет. Вот в чем дело.
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Re: Lazarus 1.6.4 и библиотеки ВербаOW

Сообщение bormant » 10.08.2017 23:28:34

Вызывающая (вероятно неправильно) сторона у вас есть. Оставьте там только вызов InitKey.
Подсуньте ей библиотеку, собранную в FPC из комстроки (вдруг какие-то опции в Lazarus причиной)
Код: Выделить всё
{$mode ObjFPC}{$H+}
library a; //вписать правильное имя
function InitKey(a, b: Pointer): Word; stdcall;
  procedure show(p: PChar);
  begin
    if p=nil then WriteLn('NIL':4)
    else begin
      while p^<>#0 do begin
        Write(Ord(p^):4); Inc(p);
      end; WriteLn;
    end;
  end;
begin
  show(a); show(b); Result:=0;
end;
exports
  InitKey;
end.
и посмотрите, соответствуют ли коды переданного ожидаемым значениям.

Можно для верности библиотеку собрать старым FPC.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Lazarus 1.6.4 и библиотеки ВербаOW

Сообщение gvido » 11.08.2017 00:10:13

Это хорошая идея. Для верности хочу в dll вообще исключить паскаль.
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Re: Lazarus 1.6.4 и библиотеки ВербаOW

Сообщение olegy123 » 11.08.2017 08:15:15

bormant писал(а):Можно для верности библиотеку собрать старым FPC.

Помоему вы пытаетесь хакнуть кодогенератор. а когда найдете где ответ - начнете патчить. в итоге окажется, что все уже есть и директивы и правила прописаны.

такой тест:
Код: Выделить всё
const disk_f:array[0..3] of byte = ($x,$x,$x,0); // ($x,$x,$x,0) = 'F:\'
InitKey(@disk_f,0);

на 100% доказывает что проблема не в передаче, а в чем то другом.

gvido не забывай полностью очищать пересобирать весь проект(rebuild), были фокусы когда пишешь одно, а программа все время работала по старому - занимаешься трассировкой. а указатель пляшет.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Lazarus 1.6.4 и библиотеки ВербаOW

Сообщение gvido » 11.08.2017 08:29:10

olegy123 писал(а):const disk_f:array[0..3] of byte = ($x,$x,$x,0); // ($x,$x,$x,0) = 'F:\'
InitKey(@disk_f,0);

Это вариант я пробовал, результат тот же. И второй параметр в таком виде компилятор не пропускает.
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Re: Lazarus 1.6.4 и библиотеки ВербаOW

Сообщение olegy123 » 11.08.2017 08:30:34

Код: Выделить всё
const disk_f:array[0..3] of byte = ($x,$x,$x,0); // ($x,$x,$x,0) = 'F:'
InitKey(@disk_f,nil);


Добавлено спустя 2 минуты 12 секунд:
сейчас заметил что вы во второй параметр пихаете, что папало..
NULL=nil=0

Добавлено спустя 5 минут 31 секунду:
C lazarus -ом, и не только с ним.. даже на php..
по поводу строк: если вы пишите код в UTF8 и потом пытаетесь с текстом работать как ANSI -ждите приключений. Как наоборот.. открываете ANSI как UTF - а у вас там шифр.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Lazarus 1.6.4 и библиотеки ВербаOW

Сообщение vitaly_l » 11.08.2017 08:41:03

gvido писал(а):Для верности хочу в dll вообще исключить паскаль.

Все параметры в DLL передаются и DLL их читает. Ошибки в компиляторе нет.
Но судя по её ответу ( E_GK ['Ошибка GK.'] ), DLL - не может из переданных параметров сгенерировать ключ
(в смысле она работает и возвращает ответ).

Попробуйте принудительно передать для DLL строку в кодировке системы, с помощью UTF8ToWinCP (несмотря на латиницу).
Именно вот так передать, а не так как Вы пробовали:
Код: Выделить всё
var s,k: String; // и обязательно попробуйте здесь WideString - это для версии 3:0 и выше.
begin
   s := UTF8ToWinCP('F:\');
   k := UTF8ToWinCP('тестовый параметр');
   err_code:=InitKey(PChar(s),PChar(k));

Есть ли у Вас тестовый пример от создателя DLL, в котором он приводит правильный тестовый пример заполнения переменных для запроса к InitKey?
Это разве правильно, что второй параметр = nil или = пустой ''; ?
И перед компилированием нажмите "очистить и собрать".

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Lazarus 1.6.4 и библиотеки ВербаOW

Сообщение gvido » 11.08.2017 12:09:43

vitaly_l писал(а):Есть ли у Вас тестовый пример от создателя DLL, в котором он приводит правильный тестовый пример заполнения переменных для запроса к InitKey?
Это разве правильно, что второй параметр = nil или = пустой ''; ?
И перед компилированием нажмите "очистить и собрать".

Второй параметр принимает либо пустую строку и тогда грузятся все ключи с носителя, либо конкретный ключь 10 или 12 символов.
UTF8ToWinCP пробовал еще до создания поста. :(

А каталог проекта, я сейчас зачищаю перед каждой компиляцией.
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Re: Lazarus 1.6.4 и библиотеки ВербаOW

Сообщение vitaly_l » 11.08.2017 12:20:27

gvido писал(а):пробовал еще до создания поста

Может быть всё наоборот и ей нужен UTF16? ( но вообще сомнительно, т.к. латиница должна везде работать )
Вот здесь НА ВСЯКИЙ СЛУЧАЙ почитайте: viewtopic.php?f=1&t=24720&p=121461&hilit=UTF8ToWinCP#p121461

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Lazarus 1.6.4 и библиотеки ВербаOW

Сообщение gvido » 11.08.2017 12:55:01

vitaly_l писал(а):Может быть всё наоборот и ей нужен UTF16? ( но вообще сомнительно, т.к. латиница должна везде работать )

Нет, точно не UTF16 сразу валится с ошибкой.
Пару раз при отладке проскакивал код проверки корректности дисковода. Видимо функция внутри dll сравнивает введенных диск с имеющимися съемными носителями. Что-то похожее на Get_Floppy_ID..
Пока рою дальше...
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

Рейтинг@Mail.ru