/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Win32 CreateFile() fejl på COM1
Fra : Anders Wegge Jakobse~


Dato : 15-03-05 22:24

Jeg har et problem med følgende stump kode:


hDev = CreateFile(devName,
GENERIC_READ | GENERIC_WRITE, // open for read/write
0, // comm devices must be opened w/exclusive-access
NULL, // no security attrs
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
FILE_FLAG_OVERLAPPED, // overlapped I/O
NULL); // hTemplate must be NULL for comm devices

// Verify device handle
if (hDev == INVALID_HANDLE_VALUE) {
dLog (logSys, "dISioOpenDevice: Unable to open <%s> due to %d",
devName, GetLastError());
return NULL;
}


dLog() har ingen sideeffekter i forhold til GetLastError(), men
alligevel ender jeg med at få følgende log:

'dISioOpenDevice: Unable to open <COM1> due to 0'

Jeg har prøvet alle mulige krumspring som at gemme resultatet af
GetLastError() i en midlertidig variabel for at eliminere eventuelle
sideeffekter af min log, og ersatte FILE_FLAG_OVERLAPPED med 0, uden
at det har ændret på resultatet. Jeg har den samme adfærd på både
Windows 2000 Server og Windows XP professional, og jeg er ærligt talt
ved at være noget mystificeret. På begge maskiner kan jeg åbne COM1
uden problemer i Hyperterminal.

Er der nogen der har et kreativt forslag til hvordan jeg i det
mindste får tryllet en brugbar fejlkode frem?

--
/Wegge
Min holdning til Usenet - <http://wiki.wegge.dk/Usenet>
Min weblog - <http://blog.wegge.dk/>

 
 
Bertel Brander (15-03-2005)
Kommentar
Fra : Bertel Brander


Dato : 15-03-05 22:44

Anders Wegge Jakobsen wrote:
> Er der nogen der har et kreativt forslag til hvordan jeg i det
> mindste får tryllet en brugbar fejlkode frem?

Jeg prøvede med denne kode:
#include <windows.h>
#include <stdio.h>

int main()
{
HANDLE hDev = CreateFile("COM1",
GENERIC_READ | GENERIC_WRITE, // open for
read/write
0, // comm devices must be opened
w/exclusive-access
NULL, // no security attrs
OPEN_EXISTING, // comm devices must use
OPEN_EXISTING
FILE_FLAG_OVERLAPPED, // overlapped I/O
NULL); // hTemplate must be NULL for comm
devices

// Verify device handle
if (hDev == INVALID_HANDLE_VALUE)
{
printf("Error: %d\n", GetLastError());
}
else
{
printf("Succes\n");
}
getchar();
return 0;
}

Og får Succes.
Hvis jeg kører to udgaver af programmet samtidig får jeg
"Error: 5" anden gang.


--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Anders Wegge Jakobse~ (18-03-2005)
Kommentar
Fra : Anders Wegge Jakobse~


Dato : 18-03-05 15:23

"Bertel" == Bertel Brander <bertel@post4.tele.dk> writes:

> Anders Wegge Jakobsen wrote:
>> Er der nogen der har et kreativt forslag til hvordan jeg i det
>> mindste får tryllet en brugbar fejlkode frem?

> Jeg prøvede med denne kode:

...

> Og får Succes.
> Hvis jeg kører to udgaver af programmet samtidig får jeg
> "Error: 5" anden gang.

Det samme resultat kom jeg også frem til. Det viste sig at være noget
helt andet der var galt. Helt præcis to ting. Dels var der to
identiske loglinier i det kode jeg sad og rodede rundt med, og det var
naturligvis den forkerte jeg sad og kiggede på.

Det der i virkeligheden var galt, var

if (dSioSetProperties() == FALSE) {
Fejl ...
}

...

int dSioSetProperties(void) {

try {
Sæt en hel masse properties ...
} catch {
...
return FALSE;
}
}

Den opmærksomme læser vil straks indse at hvis det går godt, er
returværdien fuldstændigt udefineret. Det mest imponerende er nok at
det er produktionskode der har været brugt i en 3-4 år, så hvordan det
kan være at jeg er den første der falder over det problem er et
rigtigt godt spørgsmål.


--
/Wegge
Min holdning til Usenet - <http://wiki.wegge.dk/Usenet>
Min weblog - <http://blog.wegge.dk/>

Jens Jakobsen (18-03-2005)
Kommentar
Fra : Jens Jakobsen


Dato : 18-03-05 12:23

> 'dISioOpenDevice: Unable to open <COM1> due to 0'


"COM1" er en normal fil.
"COM1:" er din com port. Med denne kan du få fat i Com1-9
"\\.\COM1" er ligeledes også din com port. Med denne kan du få Com1-n.

Håber at det hjælper,
-Jens



Anders Wegge Jakobse~ (18-03-2005)
Kommentar
Fra : Anders Wegge Jakobse~


Dato : 18-03-05 15:17

"Jens" == Jens Jakobsen <jj@delfi_do_not_spam.dk> writes:

>> 'dISioOpenDevice: Unable to open <COM1> due to 0'
> "COM1" er en normal fil.
> "COM1:" er din com port. Med denne kan du få fat i Com1-9
> "\\.\COM1" er ligeledes også din com port. Med denne kan du få Com1-n.

> Håber at det hjælper,

For at gøre det perfekt, er det ikke det navn vi åbner, der bliver
logget. Der bliver sat \\.\ foran inden CreateFile(). Se iøvrigt mit
svar til Bertel.

--
/Wegge
Min holdning til Usenet - <http://wiki.wegge.dk/Usenet>
Min weblog - <http://blog.wegge.dk/>

Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste