Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Uruchamianie programu w trybie administratora wykorzystująceg bibliotekę WinIO32

16 Sep 2015 15:03 690 3
  • Level 13  
    Dzień dobry.
    Mam następujący problem. Napisałem program sterujący portem LPT w Visual C++ wykorzystujący bibliotekę WinIO32.dll . Biblioteka ta pozwala na bezpośredni dostęp do przestrzeni IO i pamięci fizycznej. Program uruchamiany w normalnym trybie (nie administratora) nie działał prawidłowo. Procedura inicjująca bibliotekę zwracała błąd. Pobrałem kod błędu procedurą GetLastError() i był to błąd ACCESS DANIED. Do działania biblioteki konieczne jest załadowanie drivera systemowego więc przypuszczam, że program miał problem z załadowaniem tego drivera.
    Dopiero uruchomienie programu z opcją "uruchom jako administrator" spowodowało prawidłowe działanie programu. Mam pytanie czy jest jakaś możliwość uruchomienia programu w trybie normalnym (nie administratora) - może trzeba ustawić jakieś atrybuty?
    Na to że istnieje taka możliwość wskazuje to, że do pakietu z biblioteką dołączony jest przykładowy program napisany w C#. Program pracuje w trybie normalnym i działa bez problemów.

    Z góry dziękuję za pomoc.
  • Level 17  
    Ten przykładowy program w c# odpalasz z VisualStudio czy z samego exe-ka ? Jeśli z exe-ka to sprawdź czy ten exec .Netowy nie ma wkompilowanego manifestu
  • Level 32  
    Co do portu LPT ...
    1. otwierasz jako fopen("LPT", ...
    2. piszesz/czytasz za pomocą całej rodziny działającej z fopen, np: fgetc, fprintf, fscanf
    3. zamykać nie musisz
    Jak dasz sync_with_stdio() to równie dobrze działają: ifstream, ofstream, fstream

    Do LPT nie potrzebujesz żadnej biblioteki !
  • Level 13  
    Nie wykorzystuje standardowej transmisji równoległej LPT tylko steruje poszczególnymi bitami portu LPT. Stosuje do tego odwołania do portów w przestrzeni IO procesora. Niestety we współczesnych Windowsach nie można bezpośrednio odwoływać się do portów IO. Potrzebna jest specjalna biblioteka.
    Co do programu w C# odpalam EXE-ka, ale dostępne jest źródło w C#. Manifest wygląda następująco:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
    <requestedPrivileges>
    <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
    </requestedPrivileges>
    </security>
    </trustInfo>
    </assembly>

    Nie znam się na szczegółach ustawionych opcji, ale wygląda na to, że rozwiązał pan mój problem.

    Dodano po 2 [godziny] 27 [minuty]:

    Znalazłem rozwiązanie problemu.
    We właściwościach projektu w opcji "Linker"->"Maniefest file" ustawiam pole :"UAC Execution level" na wartość "requireAdministrator". Dziękuje wszystkim za pomoc. Rozwiązuje temat.