Хорошо, будем обсуждать тут. все таки больше людей его смотрят, и вероятно кто то уже с подобным имел дело.
Да и оформить ответ можно более информативно, равно как и понять суть проблемы.
Статическая линковка с mingw gcc официально не поддерживается.
1. Если официально она не поддерживается, то это как то должно быть указано, уж точно я не первый кто с 2007 года использует minGW.
постарайтесь не заниматься настойчиво стрельбой в ногу там, где это делать не обязательно =)
2. Никакой беспорядочной стрельбы, все в пределах документации.
Все функции вызываются из dll, надеюсь в правильности их подключения (приведенное в предыдущем посте) сомнений не возникает.
- Код: Выделить всё
unsigned long err = S4_SUCCESS, ndev, Len, i;
BYTE SN[250];
S4OPENINFO oi;
if (!LoadLib) return NULL;
ctx_size = 0;
if (err = S4Enum(NULL, &ctx_size), err != S4_INSUFFICIENT_BUFFER) return NULL; // определение размера контекста
sl_ctx = (PSENSE4_CONTEXT)new char[ctx_size];
if (err = S4Enum(sl_ctx, &ctx_size), err != S4_SUCCESS) return NULL;
ndev = 0; // пока он у нас единственный
oi.dwS4OpenInfoSize = sizeof(S4OPENINFO);
oi.dwShareMode = S4_SHARE_MODE;
//open the specified device
err = S4OpenEx(&sl_ctx[ndev], &oi);
if(err != S4_SUCCESS) return NULL;
err = S4ChangeDir((PSENSE4_CONTEXT)&sl_ctx[ndev], "\\" );
if(err != S4_SUCCESS) return NULL;
err = S4VerifyPin(&sl_ctx[ndev], (BYTE*)"12345678", 8, S4_USER_PIN);
if(err != S4_SUCCESS) return NULL;
тут пока подготовка, проблем в работе не выявлено.
BYTE SN[250]; выделено исключительно в демонстрационных целях из расчета размера коммуникационного буфера, нормальный размер буфера 8.
- Код: Выделить всё
for (i = 0; i < 250; i++) SN[i] = 0xff;
err = S4Control(&sl_ctx[ndev], S4_GET_SERIAL_NUMBER, SN, 0, SN, 8, &Len ); // вычитать серийник
а вот что после выполнения функции на самом деле
Как видите, серийник был передан, это полезная часть функции, но реально возвращено 22 байта
а это значит, что если буфер SN будет 8 байт, то еще 14 байт перезапишут какие нибудь переменные, или стек ... как повезет.
едем дальше
- Код: Выделить всё
Len = 0;
for (i = 0; i < 250; i++) SN[i] = 0xff;
err = S4Control(&sl_ctx[ndev], S4_LED_DOWN, NULL, 0, NULL, 0, &Len); // погасить светодиод
казалось бы ну что может быть проще, ан нет, вот ответ
имеем 50 байт в буфере SN.
кстати обратите внимание на параметры, по всем указателям стоит NULL а буфер SN меняется.
давайте так же предположим, что компилятор minGW работает правильно, и как такое возможно ?
предполагаю что все таки возможно .... выглядит это в dll примерно так:
- Код: Выделить всё
// глобальные переменные
char *inBuff = NULL;
char *outBuff = NULL;
int nIN = 0;
int nOUT = 0;
// и в функции Control
S4Control(&sl_ctx[ndev], S4_GET_SERIAL_NUMBER, ptrIN, bIN, ptrOUT, bOUT, &Len )
{
if (ptrIN != NULL) inBuff = ptrIN;
if (ptrOUT != NULL) outBuff = ptrOUT;
nIN = bIn;
nOUT = bOUT;
.......
.......
.......
}
таким образом вызвав однажды функцию с параметрами значение входного и выходного указателя на буфера уже установлены, и во всех остальных вызовах без параметров они не равны NULL.
ну а мы тем временем продолжаем и вновь зажигаем светодиод
- Код: Выделить всё
Len = 0;
for (i = 0; i < 250; i++) SN[i] = 0xff;
err = S4Control(&sl_ctx[ndev], S4_LED_UP, NULL, 0, NULL, 0, &Len); // зажигаем светодиод
а вот что после вызова.
уже 78 байт.
ну и наконец сбросим ключ
- Код: Выделить всё
Len = 0;
for (i = 0; i < 250; i++) SN[i] = 0xff;
err = S4Control(&sl_ctx[ndev], S4_RESET_DEVICE, NULL, 0, NULL, 0, &Len ); // ресет
и вот результат
к сожалению скромный размер монитора не позволяет мне показать весь буфер, но в начале передается ATR и что то там еще.
Мы обязательно передадим разработчику о таком поведении функции чтобы они это исправили
Спасибо, надеюсь описанное выше его убедит в этом.
к выше приведенному добавлю, что если многократно повторять включение светодиода, (биться головой о стенку) то буфера 250 байт не хватит, ибо оно в него со смещением постоянно пишет, и никаких проверок выхода за граничные параметры так же не предусмотрены (стена все таки ломается).
но вы со своей стороны тоже постарайтесь не заниматься настойчиво стрельбой в ногу там, где это делать не обязательно =)
и пожалуйста, не отстреливайте ему конечности, они еще приходятся
не думаю что библиотека для Windows будет переписываться на использование libusb в какое-то обозримое будущее.
это был просто как вариант, по сути при большом желании все это можно сделать и самому, другой вопрос зачем если все уже сделано, нужно только доработать напильником.
В приложении добавил переработанный sense4.h и пару файлов для удобного использования DLL в minGW, надеюсь кому то они будут полезными, потому как
Статическая линковка с mingw gcc официально не поддерживается.
и так же надеюсь, что это временно
Спасибо.