Регистрация DLL библиотеки

120
10 декабря 2019, 20:50

При попытке регистрации библиотеки выдаёт

Exeption_Search.cpp:

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
extern "C" __declspec(dllexport) void OnConnect()
{
    // {5994FCF1-EC8C-48CE-9078-3C4DE11FFD4E}
    static const GUID GUID_handler_no_null =
    { 0x5994fcf1, 0xec8c, 0x48ce,{ 0x90, 0x78, 0x3c, 0x4d, 0xe1, 0x1f, 0xfd, 0x4e } };
    MessageBox( NULL,
        L"Пустое значение", 
        0, 
        MB_OK
    );
    std::cout << "handler_no_null";
}

dllmain.cpp:

#include "stdafx.h"
HINSTANCE   g_hInst = NULL;
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
STDAPI DllRegisterServer(void)
{
    return 0;
}

В интернете подробного и понятного решения проблемы не нашла.

Answer 1

Макрос STDAPI разворачивается в extern "C" HRESULT __stdcall, т.е. он сам по себе не задает экспорт функции из DLL. Чтобы функция экспортировалась, достаточно добавить __declspec(dllexport), но для regsvr32 это не поможет, так как при __stdcall функция по умолчанию экспортируется с декорированным именем, а regsvr32 ожидает недекорированное. Для экспорта по недекорированному имени можно использовать либо def-файл, либо параметр компоновщика export (который можно задать в коде директивой pragma).

Декорированное имя для функции без аргументов имеет вид _DllRegisterServer@0 - его легко получить командой dumpbin /exports. Тогда код для экспорта DllRegisterServer будет выглядеть так:

#pragma comment(linker, "/export:DllRegisterServer=_DllRegisterServer@0")
STDAPI DllRegisterServer(void)
{
    return 0;
}
READ ALSO
Не работает клиент сокет Java Android Studio

Не работает клиент сокет Java Android Studio

Написал простой сервер с помощью сокетовЕго цель принимать данные от пользователя и отправлять их обратно Клиент я написал в Android Studio, прием-передача...

155
Как правильно писать аргументы к методу Main в Java

Как правильно писать аргументы к методу Main в Java

Как правильно писать аргументы к методу Main? Мой друг изучает java и пишет public static void Main(String args[]), хотя я пишу public static void Main(String[] args) (но на C#)Не можем...

148