прицепить Паскаль Dll к проекту Bcpp
а в ней функции
PX_Initialize
Формат: function PX_Initialize(dwPort:Integer; fCallBack:TPXMessageProc):Integer; stdcall;
где
dwPort – номер последовательного порта, к которому подключен считыватель (1 – COM1, 2 – COM2, …, 255 – COM255);
fCallBack – функция обратного вызова, в которую будут передаваться события от считывателя.
Функция открывает COM-порт и инициализирует обработчик событий.
PX_Finalize
Формат: function PX_Finalize:Integer; stdcall;
Функция закрывает ранее открытый COM-порт.
Функция обратного вызова (ФОВ)
Тип: TPXMessageProc=procedure(dwMsg:LongWord; dwSite:LongWord; strKey:ShortString); stdcall;
где
dwMsg – код события;
dwSite – идентификатор считывателя (обычно равен 0x01);
strKey – строка, содержащая код карты, поднесенной к считывателю, либо номер сработавшего входа.
Как эту DLL прицепить к проекту BCPP через LoadLibrary?
http://firststeps.ru/
Читаем там раздел про Билдер.
Читаем там раздел про Билдер.
typedef void _stdcall TPXMessageProc(unsigned dwMsg, unsigned dwSite, ShortString strKey);
typedef int _stdcall (*TPX_Initialize)(int dwPort, TPXMessageProc fCallBack);
typedef int _stdcall (*TPX_Finalize)();
// Объявляем переменные
TPX_Initialize PX_Initialize;
TPX_Finalize PX_Finalize;
// Твоя функция отклика
void _stdcall PXMessageProc(unsigned dwMsg, unsigned dwSite, ShortString strKey)
{
...
}
// Загрузка модуля и функций
void LoadPxdk;
{
HMODULE Hpxdk;
Hpxdk = LoadLibrary("pxdk.dll");
if (Hpxdk == 0)
return;
PX_Initialize = (TPX_Initialize)GetProcAddress(Hpxdk, "PX_Initialize");
PX_Finalize = (TPX_Finalize)GetProcAddress(Hpxdk, "PX_Finalize");
if (PX_Initialize == NULL)
return;
if (PX_Finalize == NULL)
return;
}
// И собственно их использование
PX_Initialize(2, PXMessageProc);
PX_Finalize();
E2342 Type mismatch in parameter 'fCallBack' (wanted 'void (__stdcall *)(unsigned int,unsigned int,ShortString)', got 'void')
E2277 Lvalue required
в объявление переменных добавил
TPXMessageProc PXMessageProc; (!!)
TPX_Initialize PX_Initialize;
TPX_Finalize PX_Finalize;
либо можно добавить целиком
void _stdcall PXMessageProc(unsigned dwMsg, unsigned dwSite, ShortString strKey);
тогда при выполнении операции
if(PX_Initialize(2,PXMessageProc)=0)
{
Application->MessageBox("Невозможно установить соединение с Proxymus\n\
Последовательый порт занят или не найден в системе",
"Ошибка", MB_ICONERROR);
}
не вылазит сообщение что незадекларирована переменная PXMessageProc
зато вылазит ошибка при компиляции, что сверху
Цитата:
это всё прочитано ДАВНО и сделано... и даже получены РЕАЛЬНЫЕ адреса функций, только при попытке использования функций сбоит программа и лезут идиотские ошибки про использование памяти.
так вот чтобы не просить помочь разобраться в МОЁМ коде, я прошу предложить СВОЙ вариант.
N.B. при подключении DLL которые делал САМ (на билдере) проблем нет
Разобрался
Сам болван, недоглядел...