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

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

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

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

Сообщение gvido » 07.08.2017 17:00:55

Добрый день, братья и Сестры!!!! :)

Как говориться Хелп, Алларм!!!

Приспичело, вернуться к дописке программки по библиотеки вербы, спотыкнулся о различия в базовых типах или автоматическом преобразовании оных, наверное.
Код который без проблем собирался и работал при fpc 2.6.2 компилится, но не работает ни 2,6,4, ни 3,0,0, ни 3,0,2.
Перерыл весь код и дошел до самой простой функции загрузки ключей в драйвер:
Код: Выделить всё
function InitKey (key_dev:Pchar; key_ID:Pchar):WORD;
  stdcall; external cDLLFn name 'InitKey';

Пол дня бодался, не мог понять что не так. Пока не утвердился в подозрении, что в функцию передается все, что угодно, но не строка однобайтовых символов.
Простой пример использования функции:
Код: Выделить всё
var
    err_code: integer;
begin
     err_code:=InitKey(Pchar('A:\'),'');
    ShowMessage(inttostr(err_code));
end;

Если ключ загружен то вернет 0. Мне же постоянно возвращало 34 - ошибка чтения GK, то есть библиотека не может прочесть главный ключ, который расположен в корне носителя.

Ткните носом - где собака порылась в версиях выше 2.6.2?!?!?! Лучше если в 3.0.2.

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

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

Сообщение wadman » 07.08.2017 17:46:52

gvido писал(а):key_dev:Pchar; key_ID:Pchar

А если заменить на PAnsiChar?
wadman
постоялец
 
Сообщения: 122
Зарегистрирован: 18.10.2016 15:54:28

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

Сообщение gvido » 07.08.2017 18:19:51

wadman писал(а):
gvido писал(а):key_dev:Pchar; key_ID:Pchar

А если заменить на PAnsiChar?

Пробовал, :). Ошибка таже 34.
чтоб ее.
Думал уже на С собрать dll c входящим параметром такого типа (pchar) и выводом того что получил на входе.
Если не будет идей , то так и придется поступить. :(
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

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

Сообщение LearnMagic » 07.08.2017 22:03:21

gvido писал(а)
Pchar('A:\')

Возможные пути решения:
1. Проверить кодировку исходных текстов и убедиться, что A - латинская
2. Явно добавить #0 в конец строки
3. Описать переменную, присвоить ей значение и передать в качестве параметра
LearnMagic
новенький
 
Сообщения: 66
Зарегистрирован: 10.11.2016 23:13:38

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

Сообщение sts » 08.08.2017 01:10:18

вот тут по другому
http://sasablog.ru/prof/wbotho/
Код: Выделить всё
//*** Функции  работы с ключами ************************************************
//==============================================================================
// Загрузить ключи в драйвер ASYNCR
// key_dev - строка с именем ключевого устройства или дескриптор контекста ридера
// key_ID  - идентификатор ключа или пустая строка ("")
//==============================================================================
function InitKey (key_dev:Pointer; key_ID:LPSTR):WORD;
  stdcall; external cDLLFn name 'InitKey';

function InitRndm (key_dev:Pointer; key_ID:DWORD):WORD;
  stdcall; external cDLLFn name 'InitRndm';
sts
постоялец
 
Сообщения: 406
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

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

Сообщение gvido » 08.08.2017 10:42:11

sts писал(а):Возможные пути решения:
1. Проверить кодировку исходных текстов и убедиться, что A - латинская
2. Явно добавить #0 в конец строки
3. Описать переменную, присвоить ей значение и передать в качестве параметра


Все это я уже попробовал, прежде чем создать пост.
Почему и решил обратиться к более опытным товарищам. Чую, что решение рядом и оно простое, но не могу нащупать.

sts писал(а):вот тут по другому
http://sasablog.ru/prof/wbotho/


С этой статьи я и начинал, но потом получил Си код и стало многое понятнее. Тем более, что в статье параметры функций объявлены не точно. В прототипе той же InitKey оба параметра являются именно pchar (InitKey (char *Key_Dev,char *Key_ID)).
Вчера поставил лазарус 1.0.14 fpc 2.6.2 - все собралось и работает отлично. с fpc 2.6.4 - уже нет.

Добавлено спустя 10 часов 25 минут 56 секунд:
Все болит и ничего не помогает....
Попробовал уже так в 1.6.4 fpc 3.0.2:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
  drive_text: array[0..3] of char;
  id_key: array[0..1] of char;
  err_code: integer;
  drv,id:pchar;
begin
  drive_text:=#70#58#92#0;
  id_key:=#0;
  drv:=drive_text;
  id:=id_key;
// err_code:=InitKey(@drive_text,@id_key);
  err_code:=InitKey(drv,id);
label1.Caption:=GetVerbaErrorStr(err_code);
end;

И, гадство... результат один err_code всегда 34 (Ошибка Gk.)
Чует мое что-то, что что-то не так...

Блин!!!!
Поставил Lazarus 1.2.0 FPC 2.6.2
И все три варианта работают на УРА!!!
Код: Выделить всё
err_code:=InitKey(@drive_text,@id_key);
  err_code:=InitKey(drv,id);
  err_code:=InitKey(pchar('F:\','');


Как так то!?!?! Ё, моё...
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

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

Сообщение SSerge » 09.08.2017 02:56:11

gvido писал(а):Как так то!?!?! Ё, моё...


Начиная с какой-то версии, лазарус при инициализации переводит RTL FreePascalя в UTF8 по умолчанию. А для компиляторов 3.х еще и включаются механизмы скрытого преобразования кодировок. Вот как-то оно так.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение gvido » 09.08.2017 08:45:31

SSerge , и что делать с таким "подарком"?
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

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

Сообщение olegy123 » 09.08.2017 10:41:24

У меня нет ВербаOW, поэтому только предлагаю:
Lazarus в редакторе пишет в UTF8, при трансляции кода любой string переходит в UTF формат по молчанию, с ним начинают работать UTF функции, за исключением если в функции прописано определенный тип, тогда он сделает перевод(должен сделать перевод). Вполне возможно что делается перевод->перевод->функция.
Возможно это делается волшебными директивами компилятора.

2)можно же так проверить
Код: Выделить всё
const disk_f:array[0..3] of byte = ($x,$x,$x,0); // ($x,$x,$x,0) = 'F:\'
..
InitKey(@disk_f,0);
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение gvido » 09.08.2017 10:50:41

olegy123 писал(а):У меня нет ВербаOW, поэтому только предлагаю:
Lazarus в редакторе пишет в UTF8, при трансляции кода любой string переходит в UTF формат по молчанию, за исключением если в функции прописано определенный тип, тогда он сделает перевод(должен сделать перевод).
Возможно это делается волшебными директивами компилятора.


Минутку... даже тут преобразует!?!?
Код: Выделить всё
var
  drive_text: array[0..3] of char;
  id_key: array[0..1] of char;
  err_code: integer;
  drv,id:pchar;
begin
  drive_text:=#70#58#92#0; //Это же заполение явно описанного массива char!!! И на кой черт тут что-то преобразовывать то?
  id_key:=#0;
  drv:=drive_text; // И тут пременной типа pchar передается адрес этого, мать его массива
  id:=id_key;
err_code:=InitKey(@drive_text,@id_key);

Я чего-то вообще логику понимать перестал. Char теперь не char вовсе, а бог знает что?

Ни у кого нет в проектах библиотек Си с функциями принимающими pchar?
Последний раз редактировалось gvido 09.08.2017 10:52:17, всего редактировалось 1 раз.
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

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

Сообщение olegy123 » 09.08.2017 10:52:00

вспомнил:
Код: Выделить всё
const drv='F:'#0;
err_code:=InitKey(@drv[1],id);

@drv = может указывать на размер строки. а не на первую букву..

Добавлено спустя 3 минуты 53 секунды:
gvido писал(а):Я чего-то вообще логику понимать перестал. Char теперь не char вовсе, а бог знает что?
Может UTF8 - размер char-а может быть 16 байт.
Я не специалист по кодировкам, но там проблемы большие проблемы..

лучше бы вы провели трасировку работы кода, и увидели что там в InitKey шлет, в 2.6 и в 3.0

Добавлено спустя 2 минуты 40 секунд:
Для компютера string - это просто участок в памяти с записными в них байтами, работу с ними производят функции, которые тоже оперируют как с байтами..
разные кодировки - разные функции подключаются.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение gvido » 09.08.2017 11:01:27

olegy123 писал(а):вспомнил:
Код: Выделить всё
const drv='F:'#0;
err_code:=InitKey(@drv[1],id);

@drv = может указывать на размер строки. а не на первую букву..

Добавлено спустя 3 минуты 53 секунды:
gvido писал(а):Я чего-то вообще логику понимать перестал. Char теперь не char вовсе, а бог знает что?
Может UTF8 - размер char-а может быть 16 байт.
Я не специалист по кодировкам, но там проблемы большие проблемы..

лучше бы вы провели трасировку работы кода, и увидели что там в InitKey шлет, в 2.6 и в 3.0

Добавлено спустя 2 минуты 40 секунд:
Для компютера string - это просто участок в памяти с записными в них байтами, работу с ними производят функции, которые тоже оперируют как с байтами..
разные кодировки - разные функции подключаются.

В трассировке, все как бы хорошо. Отладчик показывает что переменные содержать то что нужно и имеют соответствующий тип, но... Но что-то происходит, похоже в момент передачи параметров в функцию.
Может саму функцию теперь вызывать нужно как то по другому?

Нет, этот вариант тоже не прошел. ошибка та же 34..
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

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

Сообщение vitaly_l » 09.08.2017 11:14:28

gvido писал(а):бог знает что

WideChar ?
PWideChar ?
+
drv := @drive_text;
id := @id_key;
?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение olegy123 » 09.08.2017 11:54:06

gvido писал(а):Но что-то происходит, похоже в момент передачи параметров в функцию.

Ставите во время передачи остановку, смотрите данные какие перемещаются в функцию.. Так делают кейлокеры..

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

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

Сообщение SSerge » 09.08.2017 12:04:09

gvido писал(а):drv:=drive_text; // И тут пременной типа pchar передается адрес этого, мать его массива


Вы уверены?
По синтаксису, сюда скорее всего передастся указатель на начальный символ временной строки, формально являющейся копией вашего массива, возможно преобразованной между кодировками. Нужен указатель - стоит передавать адрес первого символа массива, по логике (drv:=@drive_text[0];)
Впрочем, если оттранслировать в ассемблер, и посмотреть что получилось - тогда точно будет ясно что куда перетекает, без вариантов.

Добавлено спустя 2 минуты 43 секунды:
gvido писал(а):drive_text:=#70#58#92#0;


это, кстати, присвоение строки массиву. Нужна однозначность - так присваивайте поэлементно.
Кстати, char в 16 бит не бывает, как тут кое-кто предполагает.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot] и гости: 19

Рейтинг@Mail.ru