Thread: Undefined Reference to...

  1. #1
    Registered User
    Join Date
    Apr 2007
    Posts
    102

    Undefined Reference to...

    Hey all, I'm got some decently complex code here, using a dll to set up a global mouse hook(windows stuff). Anyway, I am getting this error:

    C:/Users/JohnJr/Desktop/My Programs/Hooks/Test/main.cpp.text$_ZN9MouseHook11SetFunctionEPc[MouseHook::SetFunction(char*)]+0x55): undefined reference to `__imp__MProc@12'

    I'm not quite sure why it isn't recognizing the MProc. Here's my code, and I have linked the .a file to my project.

    Program main.cpp

    Code:
    #include <windows.h>
    #include <iostream>
    
    #include "C:\Users\JohnJr\Desktop\My Programs\Hooks\MouseHook.h"
    #include "C:\Users\JohnJr\Desktop\My Programs\Hooks\HookProcs\main.h"
    /* Declare Windows procedure */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    
    /* Make the class name into a global variable */
    char szClassName[ ] = "CodeBlocksWindowsApp";
    
    extern int mouseX;
    extern int mouseY;
    
    MouseHook* h = 0;
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpszArgument,
    int nCmdShow)
    {
    HWND hwnd; /* This is the handle for our window */
    MSG messages; /* Here messages to the application are saved */
    WNDCLASSEX wincl; /* Data structure for the windowclass */
    
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
    wincl.style = CS_DBLCLKS; /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
    
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL; /* No menu */
    wincl.cbClsExtra = 0; /* No extra bytes after the window class */
    wincl.cbWndExtra = 0; /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
    return 0;
    
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
    0, /* Extended possibilites for variation */
    szClassName, /* Classname */
    "Code::Blocks Template Windows App", /* Title Text */
    WS_OVERLAPPEDWINDOW, /* default window */
    CW_USEDEFAULT, /* Windows decides the position */
    CW_USEDEFAULT, /* where the window ends up on the screen */
    544, /* The programs width */
    375, /* and height in pixels */
    HWND_DESKTOP, /* The window is a child-window to desktop */
    NULL, /* No menu */
    hThisInstance, /* Program Instance handler */
    NULL /* No Window Creation data */
    );
    
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);
    h = new MouseHook();
    h->SetFunction("C:/Users/JohnJr/Desktop/My Programs/Hooks/HookProcs/bin/Debug/HookProcs.dll");
    
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
    /* Translate virtual-key messages into character messages */
    TranslateMessage(&messages);
    
    std::cout << mouseX;
    
    /* Send message to WindowProcedure */
    DispatchMessage(&messages);
    }
    
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
    }
    
    
    /* This function is called by the Windows function DispatchMessage() */
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message) /* handle the messages */
    {
    case WM_DESTROY:
    PostQuitMessage (0); /* send a WM_QUIT to the message queue */
    break;
    
    case WM_KEYUP:
    if(wParam == VK_SPACE)
    h->Set();
    
    else
    h->UnSet();
    
    break;
    
    default: /* for messages that we don't deal with */
    return DefWindowProc (hwnd, message, wParam, lParam);
    }
    
    return 0;
    }
    MouseHook.h(The interface class)

    Code:
    /****************************
    
    MouseHookClass
    
    Author: John M
    
    *****************************/
    
    #ifndef MHookClass
    #define MHookClass
    
    #include <windows.h>
    #include <iostream>
    
    #include "C:\Users\JohnJr\Desktop\My Programs\Hooks\HookProcs\main.h"
    
    class MouseHook
    {
    private:
    
    LRESULT CALLBACK (*MouseProc)(int nCode, WPARAM wParam, LPARAM lParam); //MouseProc pointer
    HINSTANCE hLib;
    HHOOK hook; //handle to hook
    
    public:
    
    MouseHook()
    {
    hook = NULL;
    hLib = NULL;
    }
    
    ~MouseHook()
    {
    if(MouseProc != 0)
    UnSet();
    
    }
    
    bool SetFunction(char* dll)
    {
    hLib=LoadLibrary(dll);
    
    if(hLib==NULL)
    {
    std::cout << "Unable to load library!" << std::endl;
    return false;
    }
    
    MouseProc = &MProc; << Error call is right here!
    
    return true;
    }
    
    bool Set()
    {
    if(hLib == NULL)
    return false;
    
    if(hook != NULL)
    return false;
    
    hook = SetWindowsHookEx(
    WH_MOUSE,
    (HOOKPROC)MouseProc,
    hLib,
    0);
    
    std::cout << "Hook is set";
    
    if(hook != NULL)
    return true;
    
    return false;
    }
    
    bool UnSet()
    {
    if (hook == NULL)
    return false;
    
    hook = NULL;
    
    return UnhookWindowsHookEx(hook);
    }
    };
    
    #endif
    The dll's main.h

    Code:
    #ifndef __MAIN_H__
    #define __MAIN_H__
    
    #include <windows.h>
    
    /* To use this exported function of dll, include this header
    * in your project.
    */
    
    #ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
    #else
    #define DLL_EXPORT __declspec(dllimport)
    #endif
    
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    DLL_EXPORT LRESULT CALLBACK MProc(int nCode, WPARAM wParam, LPARAM lParam);
    
    int mouseX;
    int mouseY;
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif // __MAIN_H__
    Then the main.cpp of the dll

    Code:
    #include "main.h"
    
    //May need to place in shared segment
    int mouseX = 0;
    int mouseY = 0;
    
    
    // a sample exported function
    DLL_EXPORT LRESULT CALLBACK MProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    if(nCode < 0)
    return CallNextHookEx(NULL, nCode, wParam, lParam);
    
    //Check wParam here
    if (wParam == WM_LBUTTONUP)
    {
    MOUSEHOOKSTRUCT * hHook = (MOUSEHOOKSTRUCT*)lParam;
    mouseX = hHook->pt.x;
    mouseY = hHook->pt.y;
    }
    
    return CallNextHookEx(NULL, nCode, wParam, lParam);
    }
    
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    {
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
    // attach to process
    // return FALSE to fail DLL load
    break;
    
    case DLL_PROCESS_DETACH:
    // detach from process
    break;
    
    case DLL_THREAD_ATTACH:
    // attach to thread
    break;
    
    case DLL_THREAD_DETACH:
    // detach from thread
    break;
    }
    return TRUE; // succesful
    }
    Please, if anyone can explain why the MProc isn't being recognized, I'm fairly new to DLL's and this is actually my first attempt alone. Thanks in advance!!

    Solved thanks to arpsmack.. Thanks!
    Last edited by Ken Fitlike; 08-18-2008 at 03:18 PM. Reason: Solved(This part atleast). Re-edited to restore deleted content so others may also benefit from what's learned
    My Favorite Programming Line:
    Code:
    #define true ((rand() % 2) ? true : false)

  2. #2
    Registered User
    Join Date
    Jan 2008
    Posts
    290
    "Undefined reference to..." is definitely a linker error.

    Are you sure that you compiled the DLL already and properly specified it in the linker options for your compiler?

    [edit]
    Whoa wait a minute. I just looked at your code. Are you trying to load the DLL at runtime? In that case you're going to need to call GetProcAddress to get the address of the MProc function at runtime.
    [/edit]
    Last edited by arpsmack; 08-15-2008 at 09:21 PM.

  3. #3
    Registered User
    Join Date
    Apr 2007
    Posts
    102
    Quote Originally Posted by arpsmack View Post
    "Undefined reference to..." is definitely a linker error.

    [edit]
    Whoa wait a minute. I just looked at your code. Are you trying to load the DLL at runtime? In that case you're going to need to call GetProcAddress to get the address of the MProc function at runtime.
    [/edit]
    Ok, so use GetProcAddress, to achieve it, thanks I'll try it, sounds very likely to work. Thanks again!
    My Favorite Programming Line:
    Code:
    #define true ((rand() % 2) ? true : false)

  4. #4
    C++まいる!Cをこわせ!
    Join Date
    Oct 2007
    Location
    Inside my computer
    Posts
    24,654
    Don't edit out your original question. It helps others with similar problems to search and find answers.
    Quote Originally Posted by Adak View Post
    io.h certainly IS included in some modern compilers. It is no longer part of the standard for C, but it is nevertheless, included in the very latest Pelles C versions.
    Quote Originally Posted by Salem View Post
    You mean it's included as a crutch to help ancient programmers limp along without them having to relearn too much.

    Outside of your DOS world, your header file is meaningless.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Getting an error with OpenGL: collect2: ld returned 1 exit status
    By Lorgon Jortle in forum C++ Programming
    Replies: 6
    Last Post: 05-08-2009, 08:18 PM
  2. Undefined Reference Compiling Error
    By AlakaAlaki in forum C++ Programming
    Replies: 1
    Last Post: 06-27-2008, 11:45 AM
  3. Screwy Linker Error - VC2005
    By Tonto in forum C++ Programming
    Replies: 5
    Last Post: 06-19-2007, 02:39 PM
  4. C OpenGL Compiler Error?
    By Matt3000 in forum C Programming
    Replies: 12
    Last Post: 07-07-2006, 04:42 PM
  5. c++ linking problem for x11
    By kron in forum Linux Programming
    Replies: 1
    Last Post: 11-19-2004, 10:18 AM