Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.03.2010, 16:44
ilyank ilyank вне форума
Прохожий
 
Регистрация: 29.03.2010
Сообщения: 2
Репутация: 10
По умолчанию 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  
Старый 29.03.2010, 16:47
ilyank ilyank вне форума
Прохожий
 
Регистрация: 29.03.2010
Сообщения: 2
Репутация: 10
По умолчанию

Забыл написать, что в отладчике бывает что все функции возвращают правильные значения и данные
Ответить с цитированием
  #3  
Старый 06.04.2010, 14:03
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

Для начала скомпилируй все дело в С. Посмотри - идет там или нет.
Ну а если смотреть шире - то без девайса ничего мы не сможем просмотреть. Так что нужно записать видео (или скриншоты) с компиляцией. По другому никак.
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter