次のコードはここから取得されます。Windows 7で作業しているので、すべてのWindowsNTパーツを削除しました。
このコードをコピーして、Visual Studio 2010で実行しました(新しいプロジェクト-> VC ++-> CLR-> CLRコンソール...)。しかし、コードの下にリストされているように、未解決のextern'c'エラーがたくさん発生しています。私が犯した何が悪いのですか?
#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;
}
これにより、次のエラー(およびその他の同様の未解決の外部Cエラー)が発生します。
1>wndowfind.obj : error LNK2028: unresolved token (0A000342) "extern "C" int __stdcall
EnumWindows(int (__stdcall*)(struct HWND__ *,long),long)" 3
(?EnumWindows@@$$J18YGHP6GHPAUHWND__@@J@ZJ@Z) referenced in function "int __cdecl
main(int,char * * const,char * * const)" (?main@@$$HYAHHQAPAD0@Z)
1>wndowfind.obj : error LNK2028: unresolved token (0A000346) "extern "C" unsigned long
__stdcall GetWindowThreadProcessId(struct HWND__ *,unsigned long *)"
(?GetWindowThreadProcessId@@$$J18YGKPAUHWND__@@PAK@Z) referenced in function "int __stdcall
EnumWindowsProc(struct HWND__ *,long)" (?EnumWindowsProc@@$$FYGHPAUHWND__@@J@Z)
1>wndowfind.obj : error LNK2028: unresolved token (0A000347) "extern "C" long __stdcall
GetWindowLongW(struct HWND__ *,int)" (?GetWindowLongW@@$$J18YGJPAUHWND__@@H@Z) referenced in
function "int __stdcall EnumWindowsProc(struct HWND__ *,long)"
(?EnumWindowsProc@@$$FYGHPAUHWND__@@J@Z)
1>wndowfind.obj : error LNK2019: unresolved external symbol "extern "C" int __stdcall
EnumWindows(int (__stdcall*)(struct HWND__ *,long),long)"
(?EnumWindows@@$$J18YGHP6GHPAUHWND__@@J@ZJ@Z) referenced in function "int __cdecl
main(int,char * * const,char * * const)" (?main@@$$HYAHHQAPAD0@Z)
1>c:\users\afnan\documents\visual studio 2010\Projects\wndowfind\Debug\wndowfind.exe : fatal
error LNK1120: 10 unresolved externals
1>
1>Build FAILED.
更新しました
(回答で示唆されているように)ライブラリを含めることで、プログラムを正常に実行することができました。しかし、出力に見られるように、文字列の最初の文字だけが完全な文字ではなく印刷されている理由を理解できません。
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)
上記の出力では、Sは実際には「開始」、Cは「コンソール」など、spy++ツールで確認しました。最初の文字だけでなく、完全な文字列を印刷するにはどうすればよいですか?