Ошибка при подключении DLL

126
15 октября 2019, 06:00

У меня есть DLL библиотека. Вот ее код:

#include <windows.h>
#include <iostream>
using namespace std;
__declspec(dllexport) void dummy()
{
    cout << "I am program";
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH)
    {
        cout << "hello,world!\n";
    }
    if (fdwReason == DLL_PROCESS_DETACH)
    {
        cout << "good-bye,world!\n";
    }
}

Также есть обычный exe файл, который пишет

Hello, World!

. Я заставил его подключать dll с помощью hiew32 (изменил секцию import). Но когда я запускаю exe вылезает эта ошибка:

Точка входа в процедуру dummy не найдена в библиотеке DLL
C:\Users\user\source\repos\project\release\HelloWorld.exe

Может кто знает в чем проблема?

Answer 1

Во время связывания ищется имя dummy, но не находит, потому что оно у вас декорировано в стиле С++. Уберите декорирование добавлением extern "C"

extern "C" __declspec(dllexport) void dummy()

UPD: еще стоит убедиться, что у вас стоит правильное соглашение о вызове. По умолчанию это __cdecl.

Подробнее о декорировании имен вы можете почитать тут, или можно просто набрать в гугле "name mangling".

READ ALSO
Что такое raw socket и в чем его преимущество?

Что такое raw socket и в чем его преимущество?

пытаюсь учить сетевое программирование, но пока слабо получаетсяЕсли с TCP или UDP вопрос не возникает, то с raw не могу разобраться

139
Проблемы с socket.async_accept() в boost::asio

Проблемы с socket.async_accept() в boost::asio

Пишу асинхронный TCP сервер

148
Ошибка линковки в Qt5 {Пустой проект}

Ошибка линковки в Qt5 {Пустой проект}

При попытке запустить вот такой код :

138