4

私はwinsock用のLSPを書き込もうとしていますが、MSDNのドキュメントによると、dllは単一の関数をエクスポートすることになっています。Ws2spi.hで定義されているWSPStartup()

コンパイル中にエラーが発生します:

error C2375: 'WSPStartup' : redefinition; different linkage

私が追加した場合

__declspec(dllexport) 

それへの指示。一方、私が使用する場合

__control_entrypoint(DllExport)

正常にコンパイルされますが、関数は実際にはエクスポートされません。依存関係ビューアを使用して確認しました。他のLSP実装が関数をエクスポートするかどうかを確認するために、VMWaresvsocklib.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ファイルで指定されているため、定義内の関数に任意の種類の追加指定子を追加すると、コンパイラーは「再定義」エラーを出します。

また、WSPAPI指定子が関数をstdcallとして宣言しているため、declspec(dllexport)を介して直接エクスポートすることはできません。これにより、装飾された名前が作成されます。

これらすべての問題を軽減するために、この記事に示すように、DEFファイルでメソッドをエクスポートしました-DEFファイルを使用したDLLからのエクスポート

これが、装飾されていないWSPStartup()関数をdllにエクスポートするための唯一の適切な方法だと思います。

于 2013-04-15T09:37:04.233 に答える