Невозможно установить WSPStartup в качестве экспорта dll

Я пытаюсь написать LSP для winsock, и, согласно документации MSDN, dll должна экспортировать одну функцию, а именно. WSPStartup(), как определено в Ws2spi.h

При компиляции получаю ошибку:

error C2375: 'WSPStartup' : redefinition; different linkage

Если я добавлю

__declspec(dllexport) 

директива к нему. С другой стороны, если я использую

__control_entrypoint(DllExport)

он компилируется нормально, но функция на самом деле не экспортируется. Я проверил с помощью средства просмотра зависимостей. Чтобы убедиться, что другие реализации LSP экспортируют функции или нет, я использовал средство просмотра зависимостей на VMWares vsocklib.dll и mswsock.dll, обе библиотеки экспортируют указанную функцию.

Моя примерная реализация выглядит следующим образом: -

// dllmain.cpp : Defines the entry point for the DLL application.

#include "stdafx.h"
#include <Ws2spi.h>

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;
}

__declspec(dllexport)
__checkReturn
int
WSPAPI
WSPStartup(
    __in WORD wVersionRequested,
    __in LPWSPDATA lpWSPData,
    __in LPWSAPROTOCOL_INFOW lpProtocolInfo,
    __in WSPUPCALLTABLE UpcallTable,
    __out LPWSPPROC_TABLE lpProcTable
    )
{
    return 0;
}

Так что я делаю неправильно здесь? Как создать DLL, которая экспортирует функцию WSPStartup()??


person Surojit    schedule 26.03.2013    source источник


Ответы (1)


Поскольку прототип функции находится в файле Ws2spi.h, добавление любых дополнительных спецификаторов к функции в определении приведет к тому, что компилятор выдаст ошибку "переопределения".

Также невозможно экспортировать его напрямую через declspec(dllexport), что создаст оформленное имя, поскольку спецификатор WSPAPI объявляет функцию как stdcall.

Чтобы смягчить все эти проблемы, я экспортировал метод в файл DEF, как показано в этой статье — Экспорт из DLL с использованием файлов DEF

Я считаю, что это единственный правильный способ получить недекорированный экспорт функции WSPStartup() в вашу dll.

person Surojit    schedule 15.04.2013