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.
Подскажите что не так, пожалуйста, почитал инфу, все не очень понятно.. Заранее благодарю
|