|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
usb+ (dll на С++) + Access Violation
Добрый день! Столкнулся со след.проблемой! На работу принесли некоторое устройство, подключаемое через usb. К устроству прилагается dll(сишная) и хедер. моя задача переписать хедер под delphi и написать тестовое ПО для сего устройства. И тут возникла проблема. По порядку.
хедер к dll выглядит следующим образом: Код:
typedef ULONG CCD_STATUS; typedef PVOID CCD_HANDLE; #ifdef DLLBULK_EXPORTS #define CCDAPI __declspec(dllexport) #else #define CCDAPI __declspec(dllimport) #endif extern "C" CCDAPI CCD_STATUS CCD_USBConfig(void); extern "C" CCDAPI CCD_STATUS CCD_Open(CCD_HANDLE *); extern "C" CCDAPI CCD_STATUS CCD_OpenEx(PVOID, DWORD, CCD_HANDLE *); extern "C" CCDAPI CCD_STATUS CCD_Close(CCD_HANDLE); extern "C" CCDAPI CCD_STATUS CCD_Read(CCD_HANDLE, LPVOID, DWORD, LPDWORD); extern "C" CCDAPI CCD_STATUS CCD_Write(CCD_HANDLE, LPVOID, DWORD, LPDWORD); extern "C" CCDAPI CCD_STATUS CCD_SetTimeouts(CCD_HANDLE, DWORD, DWORD); extern "C" CCDAPI CCD_STATUS CCD_ResetDevice(CCD_HANDLE); // // Device status // enum { CCD_OK, CCD_INVALID_HANDLE, CCD_DEVICE_NOT_FOUND, CCD_DEVICE_NOT_OPENED, CCD_IO_ERROR, CCD_OTHER_ERROR, CCD_TIMEOUT, CCD_INSUFFICIENT_RESOURCES, CCD_INVALID_PARAMETER, CCD_INVALID_ARGS }; Переписал хедер в лед. виде: Код:
unit dllbulk; interface uses wintypes,messages,Windows, classes, sysutils; type CCD_HANDLE = Pointer; CCD_STATUS = DWORD; PVOID = string; CCD_HANDLE_YK = ^CCD_HANDLE ; LPVOID= Pointer; CCD_Byte_YK = ^DWORD; {/////////////////////////////////////////////////////////////////////////////////// //// Function prototypes for dllbulk_ functions ///////////////////////////////////////////////////////////////////////////////////} function CCD_USBConfig(): CCD_STATUS ;cdecl; function CCD_Open(CCD_HANDLE_adr: CCD_HANDLE_YK): CCD_STATUS ;cdecl; function CCD_Close(CCD_HANDLE_id: CCD_HANDLE): CCD_STATUS ;cdecl; function CCD_OpenEx(pvArg :PVOID ; dwFlags : DWORD; CCD_HANDLE_adr: CCD_HANDLE_YK): CCD_STATUS ;cdecl; function CCD_SetTimeouts (CCD_HANDLE_id: CCD_HANDLE; dwReadTimeout:DWORD ; dwWriteTimeout:DWORD ): CCD_STATUS ;cdecl; function CCD_Write(CCD_HANDLE_id: CCD_HANDLE; lpBuffer:LPVOID; dwBytesToWrite :DWORD ;var lpdwBytesWritten: LPDWORD ): CCD_STATUS ;cdecl; function CCD_Read(CCD_HANDLE_id: CCD_HANDLE; lpBuffer:LPVOID ; wBytesToRead :DWORD;var lpdwBytesReturned: LPDWORD): CCD_STATUS ;cdecl; implementation function CCD_USBConfig;external 'dllbulk.DLL'; function CCD_Open;external 'dllbulk.DLL'; function CCD_Close;external 'dllbulk.DLL'; function CCD_OpenEx;external 'dllbulk.DLL'; function CCD_SetTimeouts;external 'dllbulk.DLL'; function CCD_Write;external 'dllbulk.DLL'; function CCD_Read;external 'dllbulk.DLL'; end. Ну и теперь в лавном модуле по нажитии на батл, хочу отправить и получить данные: Код:
procedure TForm_sys_reg.cxB_writeClick(Sender: TObject); var str :PAnsiChar; flag:boolean; LibHandle: THandle; CCD_HANDLE_adr: CCD_HANDLE_YK; CCD_Handle_id:CCD_Handle; dwBytesToWrite,real_byte,dwBytesToRead :DWORD ; fl,fl1,fl2,fl3,fl4:CCD_STATUS ; s,k1,k2,k3,k4,k5,k6,df,k:string; lpBuffer1,lpBuffer2:LPVOID; lpdwBytesWritten,lpdwBytesReturned: LPDWORD; lpdwBytesWritten1,lpdwBytesReturned1: CCD_Byte_YK; List1: array[0..5] of Byte; sd:byte; begin if CCD_Open(CCD_HANDLE_adr)=0 then begin RichEdit_test.Lines.Add('Статус: '+'- CCD_OK '); CCD_Handle_id:=CCD_HANDLE_adr^; S:=Format('%p',[CCD_Handle_id]); RichEdit_test.Lines.Add('Хэндл: '+S); ///-----отправляем количесвто кадров---------------------- dwBytesToWrite:=6; List1[0]:=2; List1[1]:=0; List1[3]:=(Lo(SpinE_numb_kadr.Value)); List1[4]:=(Hi(SpinE_numb_kadr.Value)); List1[5]:=3; lpBuffer1:=@List1; CCD_Write(CCD_HANDLE_id,lpBuffer1,dwBytesToWrite,lpdwBytesWritten); RichEdit_test.Lines.Add('Статус: '+ IntToStr(fl1)+'- CCD_OK '); dwBytesToRead:=6; // читаем что пришло CCD_Read(CCD_HANDLE_id,lpBuffer1,dwBytesToRead,lpdwBytesReturned); CCD_Close(CCD_Handle_id); end; end; В итоге получается так что вылетает c Access Violation причем в разных местах, в конце программы, на одной из команд и т.п. бывает, что вылетает ошибка прямо на команде опен, хотя устройство точно нормально подключено Возвращаемое значение всех длл-функций в случае успеха 0. Подскажите что не так, пожалуйста, почитал инфу, все не очень понятно.. Заранее благодарю |
#2
|
|||
|
|||
Забыл написать, что в отладчике бывает что все функции возвращают правильные значения и данные
|
#3
|
||||
|
||||
Для начала скомпилируй все дело в С. Посмотри - идет там или нет.
Ну а если смотреть шире - то без девайса ничего мы не сможем просмотреть. Так что нужно записать видео (или скриншоты) с компиляцией. По другому никак. Хорошо написанная программа не требует документации ICQ 9-184-668. |