18. december 2002 - 18:03
Der er
25 kommentarer og 1 løsning
Fejl i WinInet - Error C2664
Jeg vil bruge funktionen, InternetGetConnectedState fra WinInit-biblioteket -
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/internetgetconnectedstate.asp - men jeg får fejlen:
: cannot convert parameter 1 from 'const int' to 'unsigned long *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Min kode ser sådan ud:
#include <windows.h>
#include <wininet.h>
#include <iostream.h>
int main()
{
bool m;
m = InternetGetConnectedState(INTERNET_CONNECTION_LAN, 0);
cout << "Internet Connection is " << m << endl;
return 0;
}
Hvad gør jeg galt her? Jeg er helt ny i C++! Jeg kan ikke selv se fejlen...
Annonceindlæg fra FPT Software
18. december 2002 - 18:38
#1
Det første argument er et output argument !
18. december 2002 - 18:39
#2
unsigned long con; m = InternetGetConnectedState(&con, 0);
18. december 2002 - 18:56
#3
Hvad betyder når et argument er output? Jeg kommer fra Delphi og har aldrig hørt om sådan én før. Hvor kan jeg læse mere om disse argumenter? Min kode ser nu sådan ud: #include <windows.h> #include <wininet.h> #include <iostream.h> int main() { bool m; unsigned long con; m = InternetGetConnectedState(&con, 0); cout << "Internet Connection is " << m << endl; return 0; } Når jeg compiler koden får jeg 1 warning: warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning) og når jeg linker den får jeg fejlen: error LNK2001: unresolved external symbol __imp__InternetGetConnectedState@8 Ved du hvad fejlen er?
18. december 2002 - 18:59
#4
Et output argument betyder at dets værdi ved starten af kaldet ikke bliver brugt, men at det får en værdi som kan bruges efer kaldet. Hvis Delphi stadig er Pascal må det være et VAR argument !
18. december 2002 - 18:59
#5
Warningen må skyldes at den returnerer en BOOL (som formentlig er en typedef'ed int), men sdu bruger bool.
18. december 2002 - 19:00
#6
Link fejlen må skyldes at du skal linke mod et bestemt library for at linkeren kan finde funktionen.
18. december 2002 - 19:01
#7
Hvordan gør jeg så det? Jeg bruger Visual C++ 5.0
18. december 2002 - 19:03
#8
I øvrigt kender jeg godt et VAR argument!
18. december 2002 - 19:43
#9
Du ændrer bool til BOOL. Og tilføjer wininet.lib til listen i: Project -> Settings -> Link (VC++ 6.0)
18. december 2002 - 19:43
#10
Prøver lige...
18. december 2002 - 19:44
#11
Og første argument til den funktion er altså et VAR argument.
18. december 2002 - 20:01
#12
Det virker. Jeg takker 1000 gange for hjælpen...
18. december 2002 - 20:06
#13
BOOL InternetGetConnectedState( LPDWORD lpdwFlags, DWORD dwReserved ); Ved du hvordan det her skal tolkes. Jeg har stadigvæk ikke fattet, hvordan man bruger sådan en funktion i sit program.
18. december 2002 - 20:11
#14
BOOL, LPDWORD og DWORD er data typer. Henholdsvis funktionens retur-værdi, første argument og andet argument. Hvis du inkluderer windows.h kan du erklære dine variable til de typer. Men ellers så er: BOOL = int LPDWORD = int * DWORD = int hvis jeg husker rigtigt.
18. december 2002 - 20:13
#15
Hvad med argumentet lpdwFlags? Hvad og hvordan bruger man den?
18. december 2002 - 20:16
#16
Det er en out variabel d.v.s. blivet sat af funtktionen. Det er en 32 bit maske d.v.s. at hver bit betyder noget. Der er symbolske navne for bittene, d.v.s. du bør kunen skrive: unsigned long con; m = InternetGetConnectedState(&con, 0); if(con & INTERNET_CONNECTION_MODEM) { // her ved vi at det er en modem forbindelse }
18. december 2002 - 20:38
#17
På min computer er variablerne: con = 10010b = 18d INTERNET_CONNECTION_LAN = 10b = 2d Hvad sker der egentlig her: if(con & INTERNET_CONNECTION_MODEM) { betyder det at den AND'er sådan her: 10010b AND 10b = 00010b
18. december 2002 - 20:39
#18
Jeg tror jeg er ved at forstå det der... Men er det altid sådan med funktionerne i C++?
18. december 2002 - 20:40
#19
Ja. Man and'er og tester for om resultatet er forskellig fra nul. Hvis det er det, så er bitten sat.
18. december 2002 - 20:41
#20
Nej. Det hænder at man bruger bit-masker i C og C++, men det er absolut ikke altid. Men der er en vis tradition i C/C++ for low-level programmering.
18. december 2002 - 20:45
#21
Jeg takker igen... Hvor kan man læse noget mere om low-level programmering i C/C++? Jeg har arbejdet lidt med assembler før. Det er vel ikke det samme? Jeg kan se, at du kender meget til C/C++. Hvor længe har du arbejdet med det? PS. Jeg håber ikke, at jeg plager dig med spørgsmål. Jeg gør det kun for at jeg ikke skal spørge noget lign. spørgmål igen en anden gang.
18. december 2002 - 20:48
#22
Jeg ved ikke, hvor man kan læse noget om bit fifleri i C/C++. Jeg tror at de fleste lærer det the hard way ved at arbejde med det. & (binær and), | (binær or), ^ (exclusive or), ~ (ones complement) og << og >> (shift) er noget man skal arbejde lidt med.
18. december 2002 - 20:49
#23
Jeg har brugt C++ regelmæssigt siden 1989.
18. december 2002 - 20:52
#24
Hvis du vil have en bit-maske mere ligesom en Pascal packed array of boolean, så skal du lave: struct { int b1 : 1; int b2 : 1; ... } con; m = InternetGetConnectedState(&con, 0); if(con.b2) { }
18. december 2002 - 20:54
#25
Siden 1989!! Cool, du er sgu en af de hårde drenge... :) OK... Hvordan funger struct?
18. december 2002 - 20:56
#26
struct er det samme som pascal record. I det her tilfælde kunne man lave en record af 32 bits.
Kurser inden for grundlæggende programmering