4

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

编译时出现错误:

error C2375: 'WSPStartup' : redefinition; different linkage

如果我附加

__declspec(dllexport) 

对它的指示。另一方面,如果我使用

__control_entrypoint(DllExport)

它编译得很好,但实际上并没有导出函数。我使用依赖查看器进行了检查。为了确保其他 LSP 实现是否导出函数,我在 VMWares vsocklib.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;
}

那么我在这里做错了什么?如何制作导出 WSPStartup() 函数的 DLL?

4

1 回答 1

4

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

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

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

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

于 2013-04-15T09:37:04.233 回答