---
title: "SetCommMask()"
type: "forum-thread"
url: "https://www.webforum.nu/amne/c-cpp/61394-setcommmask"
topic: "C/C++"
topic_url: "https://www.webforum.nu/amne/c-cpp"
author: "Reza"
published: "2002-12-06T16:14:36.000Z"
updated: "2002-12-20T11:05:45.000Z"
replies: 51
views: 2074
page: 1
pages: 3
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/c-cpp/61394-setcommmask"
---

# SetCommMask()

_Sida 1 av 3._

## #1 — Reza, 2002-12-06T16:14Z

Hej

Varför fungerar inte GetCommMask() eller SetCommMask() med LPT1??

Hur kan en app bli notifierad om inkommande data på LPT1??

 :q

Permalänk: https://www.webforum.nu/p/61394

## #2 — PeW, 2002-12-06T22:38Z

OS?

Permalänk: https://www.webforum.nu/p/877801

## #3 — Reza, 2002-12-06T23:32Z

XP

Permalänk: https://www.webforum.nu/p/877854

## #4 — niko, 2002-12-07T00:06Z

Om man får tro vad dom [här](http://www.experts-exchange.com/Programming/Programming_Platforms/Win_Prog/Q_10016985.html) killarna säger så kan man inte göra det du vill med högnivå-API:er på NT/2000/XP.

Antingen får du skriva en egen driver eller använda en befintlig hjälp-driver. Med andra ord, tillbaka till din andra tråd: <http://www.webforum.nu/showthread.php?s=&threadid=59815>.

En tredje option är att byta OS till 9x.

Permalänk: https://www.webforum.nu/p/877872

## #5 — Reza, 2002-12-07T09:20Z

Jag använder en hjälp driver, så det fungerar att skriva till och läsa av porten direkt.
Men hur kan min app bli notifierad om inkommande data på porten.
Jag vill ju inte ligga i en loop och kolla detta hela tiden, eller?

Permalänk: https://www.webforum.nu/p/877924

## #6 — Beatbox, 2002-12-07T09:30Z

Jag hittade ett exempel i PlatformSDK:n. Har du testat om detta funkar ?

```
HANDLE hCom;
OVERLAPPED o;
BOOL fSuccess;
DWORD dwEvtMask;

hCom = CreateFile( "COM1",
    GENERIC_READ | GENERIC_WRITE,
    0,    // exclusive access 
    NULL, // no security attributes 
    OPEN_EXISTING,
    FILE_FLAG_OVERLAPPED,
    NULL
    );

if (hCom == INVALID_HANDLE_VALUE) 
{
    // Handle the error. 
    return;
}

// Set the event mask. 

fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR);

if (!fSuccess) 
{
    // Handle the error. 
    return;
}

// Create an event object for use in WaitCommEvent. 

o.hEvent = CreateEvent(
    NULL,   // no security attributes 
    FALSE,  // auto reset event 
    FALSE,  // not signaled 
    NULL    // no name 
    );

assert(o.hEvent);

if (WaitCommEvent(hCom, &dwEvtMask, &o)) 
{
    if (dwEvtMask & EV_DSR) 
    {
         // To do.
    }

    if (dwEvtMask & EV_CTS) 
    {
         // To do. 
    }
```

Permalänk: https://www.webforum.nu/p/877928

## #7 — Reza, 2002-12-07T09:34Z

Det fungerar med COM1, men inte med LPT1

Permalänk: https://www.webforum.nu/p/877932

## #8 — Beatbox, 2002-12-07T09:40Z

Det här då ?

```
      // RawDataToPrinter - sends binary data directly to a printer
      // 
      // szPrinterName: NULL-terminated string specifying printer name
      // lpData:        Pointer to raw data bytes
      // dwCount        Length of lpData in bytes
      // 
      // Returns: TRUE for success, FALSE for failure.
      // 
       BOOL RawDataToPrinter(LPSTR szPrinterName, LPBYTE lpData, DWORD dwCount)
      {
        HANDLE     hPrinter;
        DOC_INFO_1 DocInfo;
        DWORD      dwJob;
        DWORD      dwBytesWritten;

        // Need a handle to the printer.
        if( ! OpenPrinter( szPrinterName, &hPrinter, NULL ) )
          return FALSE;

        // Fill in the structure with info about this "document."
        DocInfo.pDocName = "My Document";
        DocInfo.pOutputFile = NULL;
        DocInfo.pDatatype = "RAW";
        // Inform the spooler the document is beginning.
        if( (dwJob = StartDocPrinter( hPrinter, 1, (LPSTR)&DocInfo )) == 0 )
        {
          ClosePrinter( hPrinter );
          return FALSE;
        }
        // Start a page.
        if( ! StartPagePrinter( hPrinter ) )
        {
          EndDocPrinter( hPrinter );
          ClosePrinter( hPrinter );
          return FALSE;
        }
        // Send the data to the printer.
        if( !WritePrinter( hPrinter, lpData, dwCount, &dwBytesWritten ) )
        {
          EndPagePrinter( hPrinter );
          EndDocPrinter( hPrinter );
          ClosePrinter( hPrinter );
          return FALSE;
        }
        // End the page.
        if( ! EndPagePrinter( hPrinter ) )
        {
          EndDocPrinter( hPrinter );
          ClosePrinter( hPrinter );
          return FALSE;
        }
        // Inform the spooler that the document is ending.
        if( ! EndDocPrinter( hPrinter ) )
        {
          ClosePrinter( hPrinter );
          return FALSE;
        }
        // Tidy up the printer handle.
        ClosePrinter( hPrinter );
        // Check to see if correct number of bytes were written.
        if( dwBytesWritten != dwCount )
          return FALSE;
        return TRUE;
      }
```

Permalänk: https://www.webforum.nu/p/877934

## #9 — Reza, 2002-12-07T09:49Z

Det här är ju till för skrivar drivrutiner, jag vill inte communicera med en skrivare.

Kan WaitForMultipleObjectsEx vara något om den används i samband med ReadFileEx?

Permalänk: https://www.webforum.nu/p/877941

## #10 — Beatbox, 2002-12-07T09:53Z

För att styra LPT1 på "detaljnivå" så måste du skriva en egene drivrutin.

Permalänk: https://www.webforum.nu/p/877944

## #11 — Reza, 2002-12-07T09:57Z

Jag har nog tyvärr varit lite otydlig i min beskrivning, alltså; jag KAN styra LPT porten på låg nivå, men hur kan jag få reda på att det finns data att läsa av på porten?

Finns det kanske några WM meddelande typ: WM_LäsAvLpt  :)

Permalänk: https://www.webforum.nu/p/877949

## #12 — niko, 2002-12-07T10:00Z

> **Reza skrev:**
>
> Jag använder en hjälp driver,

OK. Vilken använder du?

> **Reza skrev:**
>
> Men hur kan min app bli notifierad om inkommande data på porten.

Spekulerar nu eftersom jag aldrig kodat mot parallellporten, men på nåt sätt så måste din "hjälp-driver" också tillåta dig att ta över interrupts, skulle jag tro.

Här finns ett parallellports-toolkit som verkar göra det:

<http://www.entechtaiwan.com/tviclpt.htm>

Den kostar pengar men, finns som "fully functional demo". Har för mig att begränsningen består i att den skriver små irriterande meddelanden till event-loggen, inget mer. Kanske värt att titta på?

Permalänk: https://www.webforum.nu/p/877950

## #13 — Beatbox, 2002-12-07T10:03Z

Hur lyckas du styra LPT1 från XP utan att behandla den som en printerport ?

Permalänk: https://www.webforum.nu/p/877953

## #14 — Reza, 2002-12-07T10:13Z

Som jag skriver ovan använder jag mig av en dll (io.dll).
Jag har bifogat readme filen som följer med.

Bilagor:

- [ioreadme.txt](https://www.webforum.nu/a/792.txt)

Permalänk: https://www.webforum.nu/p/877961

## #15 — niko, 2002-12-07T10:24Z

> **Reza skrev:**
>
> Som jag skriver ovan använder jag mig av en dll (io.dll).

Ja. Och den installerar en driver som heter "io.sys" som ger dig direkt access till läsningar och skrivningar mot porten. Men frågan är om den ger dig access till interrupts/events? Jag hittar inget i hjälpfilen som tyder på det.

Permalänk: https://www.webforum.nu/p/877968

## #16 — niko, 2002-12-07T10:36Z

BTW: Har du provat giveio.sys? Den är inte specifik för att läsa mot LTP1 utan ger generell hårdvaruaccess. Eventuellt kunde alltså din SetCommMask-kod funka när den är laddad? (Nu spekulerar jag.) Men det är iaf den killarna i tråden jag länkade till pratar om (andra inlägget). 

<http://www.experts-exchange.com/Programming/Programming_Platforms/Win_Prog/Q_10016985.html>

Permalänk: https://www.webforum.nu/p/877975

## #17 — Reza, 2002-12-07T11:55Z

Jag har laddat ner giveio och installerat det, men det fungerar inte.
Jag får INVALID_HANDLE_VALUE.

h = CreateFile("\\\\\\\\.\\\\giveio", GENERIC_READ, 0, NULL,
					OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

Med min dll fil kan jag ju som bekant läsa av porten direkt, kan jag loopa och se när det finns något att läsa???

Permalänk: https://www.webforum.nu/p/878016

## #18 — developer, 2002-12-07T12:10Z

Vad returnerar GetLastError() när CreateFile() felat?

Är drivrutinen startad? Använd sc.exe för att kontrollera drivrutinen - "sc query giveio", "sc start giveio" och "sc stop giveio" borde fungera.

Permalänk: https://www.webforum.nu/p/878020

## #19 — developer, 2002-12-07T12:40Z

Jag tror att [USBLPTPD11.SYS](http://www.beyondlogic.org/usb/usblptpd11.htm) är något för dig. Det verkar som den stöder asynkron IO från parallellporten. Då borde du kunna göra en ioctl med IOCTL_WAIT_INTERRUPT, och skicka med en overlapped-struktur med ett event som du sedan väntar på med WaitForSingleObject, så signalerar drivern eventet när data kommer på porten. Då kan du göra läsningen.

(jag är inte alls säker på att jag har rätt...)

Permalänk: https://www.webforum.nu/p/878031

## #20 — Reza, 2002-12-07T13:51Z

developer, jag har suttit med det här problemet i flera dag nu (sovit bara några timmar).
Vill du vara så snäll och skriva ett exempel på hur jag väntar på inkommande data och hur jag läser det med hjälp av USBLPTPD11.SYS.
Får jag det här att funka nu kan jag sova ikväll…

Permalänk: https://www.webforum.nu/p/878065

---

Tråden på webben: https://www.webforum.nu/amne/c-cpp/61394-setcommmask  
Nästa sida: https://www.webforum.nu/amne/c-cpp/61394-setcommmask/page2.md
