Avatar billede osman Nybegynder
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...
Avatar billede arne_v Ekspert
18. december 2002 - 18:38 #1
Det første argument er et output argument !
Avatar billede arne_v Ekspert
18. december 2002 - 18:39 #2
unsigned long con;
m = InternetGetConnectedState(&con, 0);
Avatar billede osman Nybegynder
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?
Avatar billede arne_v Ekspert
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 !
Avatar billede arne_v Ekspert
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.
Avatar billede arne_v Ekspert
18. december 2002 - 19:00 #6
Link fejlen må skyldes at du skal linke mod et bestemt library
for at linkeren kan finde funktionen.
Avatar billede osman Nybegynder
18. december 2002 - 19:01 #7
Hvordan gør jeg så det? Jeg bruger Visual C++ 5.0
Avatar billede osman Nybegynder
18. december 2002 - 19:03 #8
I øvrigt kender jeg godt et VAR argument!
Avatar billede arne_v Ekspert
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)
Avatar billede osman Nybegynder
18. december 2002 - 19:43 #10
Prøver lige...
Avatar billede arne_v Ekspert
18. december 2002 - 19:44 #11
Og første argument til den funktion er altså et VAR argument.
Avatar billede osman Nybegynder
18. december 2002 - 20:01 #12
Det virker. Jeg takker 1000 gange for hjælpen...
Avatar billede osman Nybegynder
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.
Avatar billede arne_v Ekspert
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.
Avatar billede osman Nybegynder
18. december 2002 - 20:13 #15
Hvad med argumentet lpdwFlags? Hvad og hvordan bruger man den?
Avatar billede arne_v Ekspert
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
}
Avatar billede osman Nybegynder
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
Avatar billede osman Nybegynder
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++?
Avatar billede arne_v Ekspert
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.
Avatar billede arne_v Ekspert
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.
Avatar billede osman Nybegynder
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.
Avatar billede arne_v Ekspert
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.
Avatar billede arne_v Ekspert
18. december 2002 - 20:49 #23
Jeg har brugt C++ regelmæssigt siden 1989.
Avatar billede arne_v Ekspert
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) {
}
Avatar billede osman Nybegynder
18. december 2002 - 20:54 #25
Siden 1989!! Cool, du er sgu en af de hårde drenge... :)

OK... Hvordan funger struct?
Avatar billede arne_v Ekspert
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.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester