2017-06-29 8 views
0

ヘッダーファイルから関数をエクスポートしているVisual C++で書かれたDLLがあります。私はエクスポートするすべての機能を別の名前の関数でラップしています。名前を難読化し、ライセンスなしで機能を使用しようとする人には難しいものです。現在、この形式は次のようになります。このDLLヘッダーファイルをより再利用可能にする方法

#ifdef EXPORTS 
    #define API extern "C" __declspec(dllexport) 
#else 
    #define API extern "C" __declspec(dllimport) 
#endif 

CustomObject *MeaningfulFunction1(PCWSTR param); 
API CustomObject *ObfuscatedName1(PCWSTR param) 
{ 
    return MeaningfulFunction1(param); 
} 

void MeaningfulFunction2(CustomObject *param1, int param2, int &param3, int &param4); 
API void ObfuscatedName2(CustomObject *param1, int param2, int &param3, int &param4) 
{ 
    MeaningfulFunction2(param1, param2, param3, param4); 
} 
//repeat this style many times 

これはエクスポートには問題ありません。今までこのDLLを呼び出すコードはすべてC#で書かれていたので、今まではインポートのためのヘッダーは必要ありませんでした。

このヘッダはObfuscatedNameNObfuscatedName1定義を持っているので、私は、extern "C" __declspec(dllimport)定義を持っているにもかかわらず、輸入のために動作しない、とMeaningfulFunction1のためのエクスポート定義がMeangingfulFunctionNてありません。

は、私はこのような何かを見て、それを修正することができます知っている:

#ifdef EXPORTS 
CustomObject *MeaningfulFunction1(PCWSTR param); 
#endif 
API CustomObject *ObfuscatedName1(PCWSTR param) 
#ifdef EXPORTS 
{ 
    return MeaningfulFunction1(param); 
} 
#else 
; 
#endif 

しかし、それは数十の機能のために書くのは面倒であり、全体的に目障り。 このスキームを動作させる簡単な方法はありますか?プリプロセッサの定義を変更することをお勧めします。 私はこれが最初の部分は簡単ですが、私は第二部のためのスキームのような単純な見つけることができませんでした

#ifdef EXPORTS 
    #define OUT // 
#else 
    #define OUT 
#endif 
OUT CustomObject* MeaningfulFunction1(PCWSTR param); 

のようなものを考えました。プリプロセッサが見る前にコメントが削除されるので、これは機能しません。

普通の名前を1つのブロックに並べ替えることができますし、2番目の難読化された名前を付け加えることができますが、どちらを修正するかを簡単に伝えるために隣接させます。ありがとう!

+1

これはひどい考えのようです。 –

+0

@Captain私の会社は難読化を要求しています。私はただそれをサポートするための最も苦痛な方法を見つける必要があります。 – Cody

答えて

0

要件を満たしていれば、苦労したことはありませんでした。

#ifdef EXPORTS 
    #define REDIR 
    #define API extern "C" __declspec(dllexport) 
    #define CleanName 
#else 
    #define REDIR/##/
    #define API extern "C" __declspec(dllimport) 
    #define CleanName/##/
#endif 

CleanName CustomObject* Function(PCWSTR param); 
API CustomObject* Obfuscated(PCWSTR param) 
REDIR { 
REDIR return Function(param); 
REDIR } 
; 

//... 

この方法でエクスポートするときに、REDIRは何もしませんが、インポート時に、それはコメント(ビジュアルC++コンパイラconcats /// ## /なるので、それは無視されます。同じCleanNameのために行く。私はまた、持っていることを学びました関数定義の後の;はエラーではないので、最後にそれを残すことができます。ファンクション本体がエクスポート時に含まれる場合、;は何も行いませんが、インポート時に関数本体が無視されると、;は難読化された関数名の前方宣言の最後になります。

私はそうのような定義を宣言するために懸命に試みた:

#define Open/## * 
#define Close * ##/

しかし、コンパイラはそれを処理することはできませんので、ファイルの途中でEOFを挿入するように思われます。誰かがそれを働かせる方法を見つけたら、私に知らせてください。

1

grep API your_header.h > import_header.h

その後のgrepはimport_header.hの上部からアップを選択し、追加します

#define API extern "C" __declspec(dllexport) 

行を削除。各関数宣言の最後までその後、それをインポートに使用します。そして、あなたはどこにでもそれを#includeすることができ、かつしか直接あなたのコード内で意味のある名前を使用

#define MeaningfulName1 ObfuscatedName1 

あなたが試すかもしれないもう一つは、単にthusly難読化名前に意味のある名前をマップするヘッダファイルを作成しています。

全体的には、全体の計画は悪い考えです。

関連する問題