Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 25, 2010 07:57:12

estin
От:
Зарегистрирован: 2008-05-31
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с WDM драйвером (DLL) и IUnknown

День добрый.

Есть пример кода для работы с драйвером АЦП/ЦАП платы ( lcard.ru )

ULONG slot = 0;

trace("Get IUnknown pointer");
CallCreateInstance("lcomp.dll");

// -------------------------------------------------- //
LUnknown* pIUnknown = CreateInstance(slot);
if(pIUnknown == NULL) { trace("CallCreateInstance failed"); return 1; }
//----------------------------------------------------//

trace("Get IDaqLDevice interface");
IDaqLDevice* pI;
HRESULT hr = pIUnknown->QueryInterface(IID_ILDEV,(void**)&pI);
...
Функция CreateInstance(slot) возвращает указатель на объект типа LUnknown или NULL в случае ошибки.

>>import ctypes
>>print type(ctypes.cdll.lcomp.CreateInstance(0))
<type 'int'>
Как результат вызова CreateInstance перевести в IUnknown?



Отредактировано (Янв. 25, 2010 07:58:45)

Офлайн

#2 Янв. 25, 2010 12:49:40

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Работа с WDM драйвером (DLL) и IUnknown

использовать comtypes (http://pypi.python.org/pypi/comtypes/0.6.2) ;-) или pywin32



Офлайн

#3 Янв. 25, 2010 12:57:22

estin
От:
Зарегистрирован: 2008-05-31
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с WDM драйвером (DLL) и IUnknown

Используя comtypes, дошел до:

>> from comtypes import *
>> p = POINTER(IUnknown)(cdll.lcomp.CreatInstance(0))

# Привязываю к интерфейсу
>> qI = p.QueryInterface(IUnknown)

# Вызываю функцию библионтеки
>> qI.OpenLDevice()
AttributeError
Как создать этот интерфейс, и что это такое?



Отредактировано (Янв. 25, 2010 13:00:51)

Офлайн

#4 Янв. 25, 2010 19:44:48

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Работа с WDM драйвером (DLL) и IUnknown

мне скоро предстоит изучать данный вопрос , там подобного типа платы , о результатах сообщу

Офлайн

#5 Янв. 25, 2010 21:35:45

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Работа с WDM драйвером (DLL) и IUnknown

Опишите интерфейс. Пример можно подсмотреть в самих comtypes. Например, здесь: http://comtypes.svn.sourceforge.net/viewvc/comtypes/trunk/comtypes/automation.py?revision=560&view=markup для IEnumVARIANT.
Что такое интерфейс и с чем его едят - смотрите в msdn, rsdn и википедии.
Преобразовывать через QueryInterface нужно к вашему описанному интерфейсу. И, соответственно, вызывать его методы.



Офлайн

#6 Янв. 27, 2010 21:14:22

estin
От:
Зарегистрирован: 2008-05-31
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с WDM драйвером (DLL) и IUnknown

Всем спасибо!
Решение найдено.

Для работы с платами от Л-Кард, есть еще одна DLL wlcomp.dll которая является обёрткой для lcom.dll
Это обёртка не требует “Интревейсов” и имеет аналогичный API, передаются обычные указатели :)



Офлайн

#7 Янв. 27, 2010 22:24:27

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Работа с WDM драйвером (DLL) и IUnknown

Если так пугает COM - тогда что ж. Тоже решение…



Офлайн

#8 Янв. 29, 2010 11:38:13

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Работа с WDM драйвером (DLL) и IUnknown

estin
Для работы с платами от Л-Кард, есть еще одна DLL
и ты просто библиотеку подгружаешь ?

Офлайн

#9 Фев. 2, 2010 19:51:10

estin
От:
Зарегистрирован: 2008-05-31
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с WDM драйвером (DLL) и IUnknown

Да

Вот первое приближение

from ctypes import *

wl = cdll.wlcomp

hDll = pointer(c_ulong(wl.LoadAPIDLL('lcomp.dll')))
hErr = pointer(c_ulong())

print 'hDll', hDll

hIfc = pointer(c_ulong(wl.CallCreateInstance(hDll, 0, hErr)))

print 'hIfc', hIfc
print 'hErr', hErr
print wl.OpenLDevice(hIfc)


print 'Load Bios', wl.LoadBios(hIfc, 'L761')
print 'Plata Test', wl.PlataTest(hIfc)

class SlotParams(Structure):
_fields_ = [('Base', c_ulong),
('BaseL', c_ulong),
('Base1', c_ulong),
('BaseL1', c_ulong),
('Mem', c_ulong),
('MemL', c_ulong),
('Mem1', c_ulong),
('MemL1', c_ulong),
('Irq', c_ulong),
('BoardType', c_ulong),
('DSPType', c_ulong),
('Dma', c_ulong),
('DmaDac', c_ulong),
('DTA_REG', c_ulong),
('IDMA_REG', c_ulong),
('CMD_REG', c_ulong),
('IRQ_RST', c_ulong),
('DTA_ARRAY', c_ulong),
('RDY_REG', c_ulong),
('CFG_REG', c_ulong)]

"""
sl = pointer(SlotParams())
wl.GetSlotParam(hIfc, sl)

for field in sl.contents._fields_:
value = getattr(sl.contents, field[0])

print field[0], hex(int(value))
"""

print 'InitStartDevice', wl.InitStartLDevice(hIfc)
print 'StartDevice', wl.StartLDevice(hIfc)

L_ASYNC_ADC_INP = 6

class AsyncParam(Structure):
_fields_ = [
('s_Type', c_ulong),
('FIFO', c_ulong),
('IrgStep', c_ulong),
('Pages', c_ulong),

('dRate', c_double),
('Rate', c_ulong),
('NCh', c_ulong),
('Chn', c_ulong * 128),
('Data', c_ulong * 128),
('Mode', c_ulong)]


for i in range(0, 10):
pp = pointer(AsyncParam())
pp.contents.s_Type = L_ASYNC_ADC_INP

pp.contents.Chn[0] = 1

print wl.IoAsync(hIfc, pp), pp.contents.Data[0]
Про wlcomp.dll узнал на форуме Л-Кард, люди пытались работать с ней на C#



Офлайн

#10 Фев. 4, 2010 18:20:21

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Работа с WDM драйвером (DLL) и IUnknown

что пишет при обработке?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version