Search code examples
c++dlldllimportdllexport

Cannot call DLL function


I have been trying to call a DLL that simply displays a MessageBox. I am running into issues where the loader will not locate the function. When the program is running, nothing happens. Tried using user32.dll which I know works for sure. Everything went fine with the SwapMouseButton function. I have defined my imports and exports. Perhaps they were not done properly? Were my calling conversions wrong?

Here are my imports and exports:

#ifndef INDLL_H
#define INDLL_H

#ifdef EXPORTING_DLL
extern __declspec(dllexport) void HelloWorld();
#else
extern __declspec(dllimport) void HelloWorld();
#endif

#endif 

Hello World DLL (trying to display MessageBox from DLL loader):

/* Hello World DLL */
#include "stdafx.h"
#define EXPORTING_DLL
#include "sampleDLL.h"
#include "pch.h"

BOOL APIENTRY DllMain(HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    return TRUE;
}

void HelloWorld()
{
    MessageBox(NULL, TEXT("Hello World"),
        TEXT("In a DLL"), MB_OK);
}  

DLL Loader (could have wrong conversions):

/* DLL Loader */
#include <windows.h>
#include <iostream>

typedef int(__stdcall* f_funci)();

int main()
{
    HINSTANCE hGetProcIDDLL = LoadLibrary("PATH\\LoadME.dll");

    if (!hGetProcIDDLL) {
        return EXIT_FAILURE;
    }

    // resolve function
    f_funci functon = (f_funci)GetProcAddress(hGetProcIDDLL, "HelloWorld");
    if (!functon) {
        std::cout << "Function Could Not Be Located" << std::endl;
        return EXIT_FAILURE;
    }

    std::cout << "returned " << functon() << std::endl;

    return EXIT_SUCCESS;
} 

Solution

  • Your DLL function does not have a calling convention specified, so it will use the compiler's default, which is most likely __cdecl NOT __stdcall. But your EXE is defining f_funci to use __stdcall. So, even if the function could be found, it likely won't be called correctly.

    Double-check the function's name mangling in the DLL's exports table. It i likely being exported as "_HelloWorld" instead of "HelloWorld". Consider using a .DEF file when compiling the DLL in order to control how the function is exported.

    Also, consider wrapping the function's declaration in extern "C" when compiling in C++.