无法将WSPStartup设置为dll导出

Unable to set WSPStartup as a dll export

本文关键字:dll 导出 设置 WSPStartup      更新时间:2023-10-16

我正试图为winsock编写一个LSP,根据MSDN文档,dll应该导出一个函数,即Ws2spi.h中定义的WSPStartup()

在编译时,我得到一个错误:

error C2375: 'WSPStartup' : redefinition; different linkage

如果我加上

__declspec(dllexport) 

指令。另一方面,如果我使用

__control_entrypoint(DllExport)

可以很好地编译,但实际上并没有导出该函数。我使用依赖项查看器检查了。为了确保其他LSP实现是否导出这些函数,我在vmwarevsocklib .dll和mswsock.dll上使用了依赖查看器,这两个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()函数??

由于函数原型是在Ws2spi.h文件中给出的,因此在定义中向函数添加任何类型的附加说明符将导致编译器给出"重新定义"错误。

也不可能通过declspec(dllexport)直接导出它,因为它将创建一个修饰的名称,因为WSPAPI说明符将函数声明为stdcall。

为了缓解所有这些问题,我通过DEF文件导出了该方法,如本文所示-使用DEF文件从DLL导出

我相信这是唯一正确的方法来获得一个未修饰的WSPStartup()函数导出在您的dll。