Domanda

#include "stdafx.h"
#include <windows.h>
#include <winsock.h>
#include <stdio.h>

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR IpCmdLine,int nCmdShow)
{
    WSADATA ws;
    char buf[100];

    WSAStartup(0x0101,&ws);

    sprintf(buf,"%d.%d",HIBYTE(ws.wVersion),LOBYTE(ws.wVersion));
    MessageBox(0,buf,"info",0);
    WSACleanup();
    return 0;
}

Questo programma è per ottenere informazioni di versione WSock disponibile nel computer. Non riesco a capire il motivo per cui "stdafx.h" è inserita nel programma. Qual è il significato di APIENTRY? Non possiamo usare _stdcall invece? Anche non posso compilarlo in VC ++. Qual è il problema con il codice?

Di seguito sono gli errori nell'esecuzione del programma non ci sono errori durante la compilazione.

--------------------Configuration: sa - Win32 Debug--------------------
Linking...
sa.obj : error LNK2001: unresolved external symbol _WSACleanup@0
sa.obj : error LNK2001: unresolved external symbol _WSAStartup@8
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/sa.exe : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.

sa.exe - 4 error(s), 0 warning(s)
È stato utile?

Soluzione

  1. stdafx viene utilizzato per implementare intestazioni precompilate in VC ++. È possibile inserire le intestazioni di libreria come windows.h e winsock.h, ecc .. in là e che sarà compilato solo una volta ogni volta che si modifica stdafx.h.

  2. APIENTRY di solito è solo una definizione per __stdcall, ma a volte è definita vuoto (se __stdcall non è supportato per esempio). E 'per rendere il codice più portabile.

  3. Senza gli errori reali che si stanno ottenendo, non ho intenzione di essere in grado di aiutare molto. Ma la mia prima ipotesi è che avete unicode nella vostra costruzione ed è lamentarsi che MessageBoxW non prende un char [100] come argomento. In questo caso, utilizzare ampi caratteri ovunque, oppure spegnere unicode, o utilizzare MessageBoxA utilizzare in modo esplicito la versione ASCII.

Modifica:

Ora, con gli errori, è facile. Sotto Proprietà del progetto -> Linker -> Input -> Dipendenze aggiuntive, aggiungere ws2_32.lib. Così si può ottenere le funzioni Winsock collegato in.

Il _main mancante indica che si sta creando l'applicazione come una console app, e non un'applicazione di Windows. Vai al progetto Proprietà -> Linker -> Sistema e impostare sottosistema di Windows (/ Subsystem: Windows) al posto di Console. Oppure, semplicemente rinominare WinMain a int main() (Assicurarsi si lascia cadere l'APIENTRY).

Inoltre, se si sta utilizzando MSVC ++ si potrebbe anche utilizzare i sprintf_s più sicuri:

sprintf_s(buf,100,"%d.%d",HIBYTE(ws.wVersion),LOBYTE(ws.wVersion));

Altri suggerimenti

Per quanto riguarda gli errori: è necessario collegare contro libreria ws2_32.lib. È possibile farlo in due modi:

  1. Aggiungi in Proprietà del progetto -> Linker -> ingresso -.> "Librerie aggiuntive" (non dimenticate di fare questo per entrambi Debug e Release configurazioni)
  2. Nel vostro intestazione aggiungere questo direttiva del compilatore:

    #pragma comment (lib, "ws2_32.lib")

Io preferisco il secondo metodo, perché le modifiche apportate sono visibili nella fonte, invece di essere nascosti nel profondo opzioni di progetto.

Per quanto riguarda APIENTRY e simili definisce - è semplicemente una comodità come tornare NULL invece di 0 a sottolineare che si sta tornando nulla invece di un numero zero. Rende codice più facile da leggere e capire.

stdafx ha a che fare con le intestazioni precompilate in Visual Studio. Non ha nulla di specifico a che fare con la presa.

APIENTRY ha a che fare con la convenzione di chiamata di WinMain, ancora una volta non dovrebbe avere nulla a che fare con la presa.

Inserisci errori.

Per quanto riguarda gli errori del linker sono interessati si dovrebbe collegare a WSOCK32.LIB.

Se il linker si lamenta che non riesce a trovare _main, vuol dire che si sta cercando di collegare il programma come una console di applicazione, il che significa che è necessario definire main () e non WinMain (). Se si dispone di WinMain (), probabilmente si dovrebbe essere costruire la vostra applicazione come applicazione di Windows.

provare la prossima
proprietà progetto aperto, selezionate proprietà linker, selezionare Input sottovoce aggiungere Ws2_32.lib in ulteriore elemento dependecies non dimenticate di fare lo stesso per tutte le configurazioni di progetto.
Inoltre sembra che è necessario cambiare l'uso int main () invece WinMain (...)

stdafx.h - significa quando arrivavano progetti intestazione precompilata VC ++
APIENTRY - convenzione di chiamata. nel tuo caso è __stdcall, ma a volte potrebbe significare sometihng altro.

scroll top