1

VC++ で DLL を作成できません。移植可能なコードを作成するために言語拡張機能を使用したくありません。ただし、 stdafx.h のデフォルトの使用には言語拡張が必要な​​ようです。

dllmain.cpp を書き直して、stdafx.h への依存関係を削除しようとしています。まず、プリコンパイル済みヘッダーの使用を削除しました。それでも同じコンパイル エラーが発生します。

c:\program files (x86)\microsoft sdks\windows\v7.0a\include\driverspecs.h(142): error C2008: '$' : unexpected in macro definition
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\driverspecs.h(294): error C2008: '$' : unexpected in macro definition
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\driverspecs.h(295): warning C4005: '__' : macro redefinition
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\driverspecs.h(142) : see previous definition of '__'

これまでのところ、私の dllmain.cpp は次のようになっています。

// dllmain.cpp : Defines the entry point for the DLL application.
#include "WTypes.h"

#define DLL_PROCESS_ATTACH   1    
#define DLL_THREAD_ATTACH    2    
#define DLL_THREAD_DETACH    3    
#define DLL_PROCESS_DETACH   0    
typedef void far            *LPVOID;

int WINAPI DllMain( HINSTANCE hModule,
                       int  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 1;
}

ここで正しいアプローチを使用していますか? WTypes.h の最後の依存関係 (HINSTANCE) を取り除くことはできますか?

どうもありがとう

4

1 に答える 1

1

通常、Visual Studio C++ によって生成された DLL エントリ関数は、Windows オペレーティング システムが DLL をメモリにロードして初期化できるようにするための基本を含んでいるため、いかなる方法でも変更されません。

私が読んだすべてのことは、WindowsがDLLをロードし、さまざまなDLLエントリポイントを利用可能にするために必要なすべてを初期化するという深刻な問題を回避するために、DLLMain()は初期化を含めてできるだけ少なくすべきだと言っています。

多くの Windows API の要素と定義があり、それ以外はほとんどないことに気付くでしょう。

したがって、通常は他のソース ファイルにある残りの DLL メソッドを移植可能にすると、DLL のメインを切り取って、移植したい OS 固有の動的ロード初期化をその代わりに置き、保持することができる場合があります。ソースの残りの部分。

DLLMain は、Windows が DLL をロードし、さまざまな関数のオフセットとアドレスを修正するために必要な Windows OS 固有のエントリ ポイントを持つ場所です。

DLLMain() に関するこの MSDN の記事も参照してください。

そして、このDLL チュートリアル.

また、 DLLMain() の変更に関するこの注意を参照してください。

于 2013-09-29T19:11:03.657 に答える