Nejsem tak zdatný v programování OOP, snažil jsem se najít nějaké informace na NETu, ale bez úspěchu (zejména pro VBA). Konkrétně: k PC (Windows 2000) mám připojenou čtečku karet do COM5 na adresách 9000h-9008h. Připravuju tabulku pod Excelem, která potřebuje kartu přečíst a data dále zpracovat (celkem pravděpodobně 6 Bytů dat odeslaných najednou). Snažil jsem se data načíst pomocí "kernel32.dll", zkoušel i nahrát jinými oblíbenou knihovnu "RSCOM.dll", ale kromě toho, že nevím, jak správně nastavit veškeré parametry, mám hlavně problém s tím, že již obsazený port (systém nebo program nalezl připojený hardware) nelze ani otevřít. Připojim zdroják, který jsem sesmolil a kde je určitě něco nebo více špatně: ------------------------------------------------- Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" ( _ ByVal lpFileName As String, _ ByVal dwDesiredAccess As Long, _ ByVal dwShareMode As Long, _ ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, _ ByVal dwCreationDisposition As Long, _ ByVal dwFlagsAndAttributes As Long, _ ByVal hTemplateFile As Long) _ As Long Declare Function ReadFile Lib "kernel32.dll" ( _ ByVal hFile As Long, _ ByRef lpBuffer As Any, _ ByVal nNumberOfBytesToRead As Long, _ ByRef lpNumberOfBytesRead As Long, _ ByRef lpOverlapped As OVERLAPPED) _ As Long Declare Function CloseHandle Lib "kernel32.dll" ( _ ByVal hObject As Long) As Long Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As Long End Type Type OVERLAPPED ternal As Long ternalHigh As Long offset As Long OffsetHigh As Long hEvent As Long End Type Const GENERIC_READ As Long = &H80000000 Const OPEN_EXISTING As Long = 3 Const FILE_FLAG_OVERLAPPED As Long = &H40000000 Dim atributH As SECURITY_ATTRIBUTES Dim atributX As OVERLAPPED ------------------------------------------------- Sub NactiStav() PortCOM = "COM2" HandleCOM = CreateFile(PortCOM & Chr(0), GENERIC_READ, 0, atributH, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0) MsgBox " Handle na: " & PortCOM & vbCr & HandleCOM StavPortu = ReadFile(HandleCOM, AktStav, 6, 6, atributX) MsgBox " Stav: " & vbCr & StavPortu & vbCr & AktStav ukoncit = CloseHandle(HandleCOM) End Sub ------------------------------------------------- První výpis by měl podle mého vypsat handle na otevřený port (obsazený port třeba myší nepovolí a výstup je -1) - no nevím, ale výsledná hodnota je kolem 1000 a např. příkaz "Application.Hwnd" mi hodí o 3 řády vyšší číslo, ale dejme tomu. Druhý výpis pro stav portu je vždy na 0. Ukáže mi nějakej šikula/šikulka způsob, jak takovou zdánlivě primitivní funkci sestavit?
|