无法将WSPStartup设置为dll导出

时间:2013-03-26 19:03:52

标签: c++ dll winsock dllexport winsock-lsp

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

编译时我收到错误:

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?

1 个答案:

答案 0 :(得分:3)

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

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

为了缓解所有这些问题,我通过DEF文件导出了该方法,如本文所示 - Exporting from a DLL Using DEF Files

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