27. december 2001 - 17:59Der er
18 kommentarer og 1 løsning
outport/inport fejl i visual c++
Får følgende fejl når jeg build midt program Linking... I2C.obj : error LNK2001: unresolved external symbol _outport I2C.obj : error LNK2001: unresolved external symbol _inport Debug/dimmer.exe : fatal error LNK1120: 2 unresolved externals Error executing link.exe.
dimmer.exe - 3 error(s), 0 warning(s)
Har fundet følgende fra Soepro, men er ikke helt med på hvor kode stumpen skal placers (ASM).Bruger Microsoft Visual C++
inp og outp funktionerne er ganske rigtigt \"gamle\" DOS funktioner, dvs. funktioner som kun er tilladte hvis programmet kører som et DOS program/under DOS boks. Grunden til at inp og outp ikke længere er tilladte ligger i selv Windows - det er jo (i alt fald et forsøg på at lave) et flerbruger system, og man kan derfor ikke være sikker på at have f.eks. LPT-porten for sig selv. (Word kunne f.eks. være ved at udskrive via porten.)
Jeg har løst problemet i mit program (bruger LPT-porten til at styre noget elektronik) ved at bruge ASM - i den situation sættes Windows begræsningerne nemlig i noget omfang ud af spil:
int inport(int portAddr) { int portData = 0x00; asm { mov dx,portAddr in al,dx mov portData,al }; return portData; }
og
void outport(int portAddr, int portData) { // Port data adjusted immediately when changed. asm { mov dx, portAddr mov al, portData out dx, al }; return; } Idet du så med følgende to macroer re-directer dine inp og outp kald til d.o.:
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
--------------------Configuration: dimmer - Win32 Debug-------------------- Linking... LINK : warning LNK4098: defaultlib \"LIBCD\" conflicts with use of other libs; use /NODEFAULTLIB:library I2C.obj : error LNK2001: unresolved external symbol _outport I2C.obj : error LNK2001: unresolved external symbol _inport Debug/dimmer.exe : fatal error LNK1120: 2 unresolved externals Error executing link.exe.
dimmer.exe - 3 error(s), 1 warning(s)
Ja, har inkluderet <conio.h>
Her er et program stump med outport
Output data to selected IO-port and update the \'IOdata\' & \'IO\' array. --------------------------------------------------------------------- */ void IOoutput(int Chip_no, int Data) { int Start_Channel, Channel, SerData, cport, i, j;
Data = (~Data) | IOconfig[Chip_no]; /*Mask input channels*/
/*Generate start condition*/ outport(ControlPort, 0x06); for (i = 0; i <= I2CbusDelay; i++) {}; /*I2c-bus timing*/ outport(ControlPort, 0x0E); for (i = 0; i <= I2CbusDelay; i++) {}; /*I2c-bus timing*/
Her er et program stump med input
/*Serial input of previous converted byte*/ Data = 0; /*Clear Data*/ for (j = 1; j <= 8; j++) { Data <<= 1; outport(ControlPort, 0x04); for (i = 0; i <= I2CbusDelay; i++) {}; /*I2c-bus timing*/ if (inport(StatusPort) & 0x10) Data = Data | 0x0001; outport(ControlPort, 0x0C); for (i = 0; i <= I2CbusDelay; i++) {}; /*I2c-bus timing*/ };
Jeg ved ikke hvor meget kontrol du har brug for, men du kan sagten have LPT porten for dig selv. Du kan få adgang til LPT porten ved at anvende den som en fil:
HANDLE hLPT = CreateFile( \"LPT1\", // pointer to name of the file GENERIC_READ|GENERIC_WRITE, // access (read-write) mode 0, // share mode NULL, // pointer to security attributes OPEN_EXISTING, // how to create FILE_FLAG_WRITE_THROUGH, // file attributes NULL // handle to file with attributes to copy );
if( hLPT == INVALID_HANDLE_VALUE ) { cout << \"Failed\" << endl; // port does not exist or is already acquired } else { while(1); // endless loop to hold LPT port }
Har prøvet at rette et par outport/inport til _outp/_inp men får nu også de to siste advarsler når jeg compile programet,men de kommer ikke når jeg prøver et etexecute programet?
Compiling... I2C.c D:\\K8000\\opgaver\\dimmer\\I2C.c(297) : warning C4013: \'outport\' undefined; assuming extern returning int D:\\K8000\\opgaver\\dimmer\\I2C.c(1220) : warning C4013: \'inport\' undefined; assuming extern returning int D:\\K8000\\opgaver\\dimmer\\I2C.c(295) : warning C4761: integral size mismatch in argument; conversion supplied D:\\K8000\\opgaver\\dimmer\\I2C.c(1199) : warning C4761: integral size mismatch in argument; conversion supplied
I2C.obj - 0 error(s), 4 warning(s)
Er ikke helt med på hvordan man kan andvende en fil? Kan det forklars så jeg kan fåstå det :-)
Mine kode-stumper, skal du blot inkludere i din kode FØR de funktioner der anvender dem. Alternativ skal du lave en header-fil med prototyperne på funktionerne:
int inport(int adr); void outport(int port, int data);
og lave #include på den - igen FØR du anvender funktionerne.
Tak det skal skrives \"_asm\" .Men jag får stadig 4 fejl som jeg ikke kan få væk, hvad kan det skylles ?
#include <windows.h>
int inport(int portAddr) { int portData = 0x00; _asm { mov dx,portAddr in al,dx //9 mov portData,al }; //11 return portData; }
void outport(int portAddr, int portData) { // Port data adjusted immediately when changed. _asm { mov dx, portAddr mov al, portData //21 out dx, al //22 };
Okey det her er et gæt: Prøve at bruge short istedet for portAdr og char for portData, du prøver henholdvis på at putte en int (32bit) ned i dx (16bit) og int i al (8bit) ( = operand size conflict ? ).
hey har lånt kode stumpen til et skole projekt. Håber det er okay. Prøver at lave det under XP compiled med .net 2003 og når det bliver kørt kommer der en "Privileged instruction" fejl.... er der nogen der har en idé om hvad man så kan gøre for at få direkte kontrol over LPT'en? har kun inkluderet windows.h er der andet man måske skulle gøre?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.