Здравствуйте уважаемые Знатоки!!! Прошу вашей помощи!
Застрял в попытке перевода части программы написанной в Delphi 7 на С# (а именно обращение к железу через ДЛЛ ...)
Суть такова: в Delphi 7 есть класс который получает указатель из ДЛЛ, ну и сопутствующие переменные ...
type
Lusbbase = class
// ôóíêöèè îáùåãî íàçíà÷åíèÿ äëÿ ðàáîòû ñ USB óñòðîéñòâàìè
Function OpenLDevice(VirtualSlot : WORD) : BOOL; virtual; stdcall; abstract;
Function CloseLDevice : BOOL; virtual; stdcall; abstract;
Function ReleaseLInstance : BOOL; virtual; stdcall; abstract;
// ïîëó÷åíèå äåñêðèïòîðà óñòðîéñòâà USB
Function GetModuleHandle : THandle; virtual; stdcall; abstract;
// ïîëó÷åíèå íàçâàíèÿ èñïîëüçóåìîãî ìîäóëÿ
Function GetModuleName(ModuleName : pAnsiChar) : BOOL; virtual; stdcall; abstract;
// ïîëó÷åíèå òåêóùåé ñêîðîñòè ðàáîòû øèíû USB
Function GetUsbSpeed(UsbSpeed : pBYTE) : BOOL; virtual; stdcall; abstract;
// óïðàâëåíèÿ ðåæèìîì íèçêîãî ýëåêòðîïîòðåáëåíèÿ ìîäóëÿ
Function LowPowerMode(LowPowerFlag : BOOL) : BOOL; virtual; stdcall; abstract;
// ôóíêöèÿ âûäà÷è ñòðîêè ñ ïîñëåäíåé îøèáêîé
Function GetLastErrorInfo(LastErrorInfo : pLAST_ERROR_INFO_LUSBAPI) : BOOL; virtual; stdcall; abstract;
end;
// ...
ILE140 = class(Lusbbase)
public
// ôóíêöèè äëÿ ðàáîòû ñ ÀÖÏ
Function GET_ADC_PARS(AdcPars : pADC_PARS_E140) : BOOL; virtual; stdcall; abstract;
Function SET_ADC_PARS(AdcPars : pADC_PARS_E140) : BOOL; virtual; stdcall; abstract;
Function START_ADC : BOOL; virtual; stdcall; abstract;
Function STOP_ADC : BOOL; virtual; stdcall; abstract;
Function ADC_KADR(Data : pSHORT) : BOOL; virtual; stdcall; abstract;
Function ADC_SAMPLE(AdcData : pSHORT; AdcChannel : WORD) : BOOL; virtual; stdcall; abstract;
Function ReadData(ReadRequest : pIO_REQUEST_LUSBAPI) : BOOL; virtual; stdcall; abstract;
// ôóíêöèè äëÿ ðàáîòû ñ ÖÀÏ
Function GET_DAC_PARS(DacPars : pDAC_PARS_E140) : BOOL; virtual; stdcall; abstract;
Function SET_DAC_PARS(DacPars : pDAC_PARS_E140) : BOOL; virtual; stdcall; abstract;
Function START_DAC : BOOL; virtual; stdcall; abstract;
Function STOP_DAC : BOOL; virtual; stdcall; abstract;
Function WriteData(WriteRequest : pIO_REQUEST_LUSBAPI) : BOOL; virtual; stdcall; abstract;
Function DAC_SAMPLE(DacData : pSHORT; DacChannel : WORD) : BOOL; virtual; stdcall; abstract;
Function DAC_SAMPLES(DacData1, DacData2 : pSHORT) : BOOL; virtual; stdcall; abstract;
// ôóíêöèè äëÿ ðàáîòû ñ öèôðîâûìè ëèíèÿìè
Function ENABLE_TTL_OUT(EnableTtlOut : BOOL) : BOOL; virtual; stdcall; abstract;
Function TTL_IN(TtlIn : pWORD) : BOOL; virtual; stdcall; abstract;
Function TTL_OUT(TtlOut : WORD) : BOOL; virtual; stdcall; abstract;
// ôóíêöèè äëÿ ðàáîòû ñ ïîëüçîâàòåëüñêîé èíôîðìàöèåé ÏÏÇÓ
Function ENABLE_FLASH_WRITE(IsFlashWriteEnabled : BOOL) : BOOL; virtual; stdcall; abstract;
Function READ_FLASH_ARRAY(UserFlash : pUSER_FLASH_E140) : BOOL; virtual; stdcall; abstract;
Function WRITE_FLASH_ARRAY(UserFlash : pUSER_FLASH_E140) : BOOL; virtual; stdcall; abstract;
// ôóíêöèè äëÿ ðàáîòû ñî ñëóæåáíîé èíôîðìàöèåé ÏÏÇÓ
Function GET_MODULE_DESCRIPTION(ModuleDescription : pMODULE_DESCRIPTION_E140) : BOOL; virtual; stdcall; abstract;
Function SAVE_MODULE_DESCRIPTION(ModuleDescription : pMODULE_DESCRIPTION_E140) : BOOL; virtual; stdcall; abstract;
// ôóíêöèè äëÿ ïðÿìîãî äîñóïà ê ìèêðîêîíòðîëëåðó
Function GetArray(Buffer : pBYTE; Size, Address : WORD) : BOOL; virtual; stdcall; abstract;
Function PutArray(Buffer : pBYTE; Size, Address : WORD) : BOOL; virtual; stdcall; abstract;
end;
pILE140 = ^ILE140;
и это мероприятие я перенес на С#
public abstract class _ILUSBBASE : ILUSBBASE
{
[MethodImpl(MethodImplOptions.Synchronized)]
// функции общего назначения для работы с USB устройствами
public abstract bool OpenLDevice(ushort VirtualSlot);
public abstract bool CloseLDevice();
public abstract bool ReleaseLInstance();
// получение дескриптора устройства USB
public abstract IntPtr GetModuleHandle();
// получение названия используемого модуля
public abstract bool GetModuleName(string ModuleName);
// получение текущей скорости работы шины USB
public abstract bool GetUsbSpeed( ref byte UsbSpeed);
// управления режимом низкого электропотребления модуля
public abstract bool LowPowerMode(bool LowPowerFlag);
// функция выдачи строки с последней ошибкой
public abstract bool GetLastErrorInfo(ref LAST_ERROR_INFO_LUSBAPI LastErrorInfo);
};
public interface ILUSBBASE { }
//-----------------------------------------------------------------------------
// интерфейс для модуля E14-140
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential)]
public abstract class ILE140 : ILUSBBASE
{
[MethodImpl(MethodImplOptions.Synchronized)]
// функции для работы с АЦП
public abstract bool GET_ADC_PARS(ref ADC_PARS_E140 AdcPars);
public abstract bool SET_ADC_PARS(ref ADC_PARS_E140 AdcPars);
public abstract bool START_ADC();
public abstract bool STOP_ADC();
public abstract bool ADC_KADR(ref short Data);
public abstract bool ADC_SAMPLE(ref short AdcData, ushort AdcChannel);
public abstract bool ReadData(ref IO_REQUEST_LUSBAPI ReadRequest);
// функции для работы с ЦАП
public abstract bool GET_DAC_PARS(ref DAC_PARS_E140 DacPars);
public abstract bool SET_DAC_PARS(ref DAC_PARS_E140 DacPars);
public abstract bool START_DAC();
public abstract bool STOP_DAC();
public abstract bool WriteData(ref IO_REQUEST_LUSBAPI WriteRequest);
public abstract bool DAC_SAMPLE(ref short DacData, ushort DacChannel);
public abstract bool DAC_SAMPLES(ref short DacData1,ref short DacData2);
// функции для работы с ТТЛ линиями
public abstract bool ENABLE_TTL_OUT(bool EnableTtlOut);
public abstract bool TTL_IN(ref ushort TtlIn);
public abstract bool TTL_OUT(ushort TtlOut);
// функции для работы с пользовательской информацией ППЗУ
public abstract bool ENABLE_FLASH_WRITE(bool IsUserFlashWriteEnabled);
public abstract bool READ_FLASH_ARRAY(ref USER_FLASH_E140 UserFlash);
public abstract bool WRITE_FLASH_ARRAY(ref USER_FLASH_E140 UserFlash);
// функции для работы со служебной информацией ППЗУ
public abstract bool GET_MODULE_DESCRIPTION(ref MODULE_DESCRIPTION_E140 ModuleDescription);
public abstract bool SAVE_MODULE_DESCRIPTION(ref MODULE_DESCRIPTION_E140 ModuleDescription);
// функции для прямого досупа к микроконтроллеру
public abstract bool GetArray(ref byte _Buffer, ushort Size, ushort Address);
public abstract bool PutArray(ref byte _Buffer, ushort Size, ushort Address);
};
все структуры объявлены верно!... а вот данные структуры я правильно объявил?!
потому что при обращении к ДЛЛ и C#, а есть ошибка ибо:
в Делпхи все работает на ура!
pModule : ILE140;
Function CreateLInstance(DeviceName : pAnsiChar) : Pointer; External 'Lusbapi.dll'
//...
pModule := CreateLInstance(pCHAR('e140'));
в С# бока:
[DllImport("Lusbapi.dll",
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
public static extern IntPtr CreateLInstance(string DeviceName);
ILE140 pModule = null;
pModule = (ILE140)CreateLInstance("e140");// Ошибка конвертации!!!!!!! (но сама функция CreateLInstance("e140") значения возвращает!)
Подскажите что я делаю не так?!
Огромное СПАСИБО!