Найти - Пользователи
Полная версия: Работа с WDM драйвером (DLL) и IUnknown
Начало » Python для экспертов » Работа с WDM драйвером (DLL) и IUnknown
1 2
estin
День добрый.

Есть пример кода для работы с драйвером АЦП/ЦАП платы ( 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?
pyuser
использовать comtypes (http://pypi.python.org/pypi/comtypes/0.6.2) ;-) или pywin32
estin
Используя comtypes, дошел до:
>> from comtypes import *
>> p = POINTER(IUnknown)(cdll.lcomp.CreatInstance(0))

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

# Вызываю функцию библионтеки
>> qI.OpenLDevice()
AttributeError
Как создать этот интерфейс, и что это такое?
sypper-pit
мне скоро предстоит изучать данный вопрос , там подобного типа платы , о результатах сообщу
Андрей Светлов
Опишите интерфейс. Пример можно подсмотреть в самих comtypes. Например, здесь: http://comtypes.svn.sourceforge.net/viewvc/comtypes/trunk/comtypes/automation.py?revision=560&view=markup для IEnumVARIANT.
Что такое интерфейс и с чем его едят - смотрите в msdn, rsdn и википедии.
Преобразовывать через QueryInterface нужно к вашему описанному интерфейсу. И, соответственно, вызывать его методы.
estin
Всем спасибо!
Решение найдено.

Для работы с платами от Л-Кард, есть еще одна DLL wlcomp.dll которая является обёрткой для lcom.dll
Это обёртка не требует “Интревейсов” и имеет аналогичный API, передаются обычные указатели :)
Андрей Светлов
Если так пугает COM - тогда что ж. Тоже решение…
sypper-pit
estin
Для работы с платами от Л-Кард, есть еще одна DLL
и ты просто библиотеку подгружаешь ?
estin
Да

Вот первое приближение
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#
sypper-pit
что пишет при обработке?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB