2012-06-17 26 views
7

El siguiente código se toma de here quité toda la parte de Windows NT como estoy trabajando en Windows 7.vs 2010: error LNK2028:. Símbolo sin resolver (0A000342) "extern "C int" __stdcall

Copié esta codificar y ejecutar en visual studio 2010 (Nuevo proyecto-> VC++ -> CLR-> Consola CLR ...). Pero está dando muchos errores externos 'c' no resueltos como se detalla debajo del código. ¿Qué error he cometido?

#define STRICT 1 

#include <windows.h> 
#include <iostream> 
using namespace std; 

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) { 
DWORD dwThreadId, dwProcessId; 
HINSTANCE hInstance; 
char String[255]; 
HANDLE hProcess; 
if (!hWnd) 
return TRUE;  // Not a window 
if (!::IsWindowVisible(hWnd)) 
return TRUE;  // Not visible 
if (!SendMessage(hWnd, WM_GETTEXT, sizeof(String), (LPARAM)String)) 
return TRUE;  // No window title 
hInstance = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); 
dwThreadId = GetWindowThreadProcessId(hWnd, &dwProcessId); 
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId); 
cout << hWnd << ' ' << dwProcessId << '\t' << String << '\t'; 
cout << "(None)\n"; 
CloseHandle(hProcess); 
return TRUE; 
} 

int main(int argc, char *argv[], char *envp[]) { 
EnumWindows(EnumWindowsProc, NULL); 
return 0; 
} 

Esto se produce errores siguientes (y otros errores similares no resueltos extern C)

1>wndowfind.obj : error LNK2028: unresolved token (0A000342) "extern "C" int __stdcall  
EnumWindows(int (__stdcall*)(struct HWND__ *,long),long)"  3 
([email protected]@[email protected]@[email protected]@Z) referenced in function "int __cdecl 
main(int,char * * const,char * * const)" ([email protected]@[email protected]) 

1>wndowfind.obj : error LNK2028: unresolved token (0A000346) "extern "C" unsigned long 
__stdcall GetWindowThreadProcessId(struct HWND__ *,unsigned long *)"  
([email protected]@[email protected]@[email protected]) referenced in function "int __stdcall 
EnumWindowsProc(struct HWND__ *,long)" ([email protected]@[email protected]@[email protected]) 

1>wndowfind.obj : error LNK2028: unresolved token (0A000347) "extern "C" long __stdcall 
GetWindowLongW(struct HWND__ *,int)" ([email protected]@[email protected]@[email protected]) referenced in 
function "int __stdcall EnumWindowsProc(struct HWND__ *,long)" 
([email protected]@[email protected]@[email protected]) 

1>wndowfind.obj : error LNK2019: unresolved external symbol "extern "C" int __stdcall 
EnumWindows(int (__stdcall*)(struct HWND__ *,long),long)" 
([email protected]@[email protected]@[email protected]@Z) referenced in function "int __cdecl 
main(int,char * * const,char * * const)" ([email protected]@[email protected]) 

1>c:\users\afnan\documents\visual studio 2010\Projects\wndowfind\Debug\wndowfind.exe : fatal 
error LNK1120: 10 unresolved externals 
1> 
1>Build FAILED. 

ACTUALIZADO

Con la inclusión de las bibliotecas (como se sugiere en las respuestas), yo era capaz de ejecutar el programa con éxito. Pero no soy capaz de entender por qué sólo el primer carácter de la cadena no está imprimiendo al completo, como puede verse en la salida:

00010060 2652 S  (None) 
002502B2 5820 C  (None) 
00090402 5160 w  (None) 
00050392 5160 w  (None) 
00060292 3520 F  (None) 
000C02BA 3520 M  (None) 
0001021A 3736 E  (None) 
00040018 896 I  (None) 
00010170 3580 A  (None) 
0002003E 2684 D  (None) 
00030316 4956 N  (None) 
000202DE 3736 D  (None) 
0001031E 2652 S  (None) 
000100EA 2652 P  (None) 

En la salida anterior, S es en realidad "Inicio", C es " consola "etc. Confirmé a través de la herramienta espía ++. ¿Cómo puedo imprimir la cadena completa en lugar de solo el primer carácter?

+1

Su proyecto probablemente esté configurado para compilar en Unicode, lo que significa que debe usar una matriz wchar_t en lugar de una matriz char. –

Respuesta

21

Los proyectos CLR de forma predeterminada no incluyen las bibliotecas estándar de Windows, como user32.lib.

Edite las propiedades de su proyecto, busque la opción Enlazado de entradas y agregue kernel32.lib user32.lib advapi32.lib, que son las bibliotecas habituales que necesita el código de Win32.

+0

¡Funcionó! por favor mira mi actualización arriba. – gpuguy

+0

Esto fue difícil de alcanzar. ¡Gracias! – twip

Cuestiones relacionadas