2011-09-13 9 views
5

Log(char* str)のような私のexeファイルにいくつかの汎用関数が定義されています。この関数は、呼び出し元からの文字列を入力として受け取り、そのアプリケーション用に定義されたログファイルに書き込みます。今、私は、ファイルをサーバにアップロードする機能を含むDLLコードを書いています。私のexeファイルで定義された関数をDLLの中で呼び出す方法は?

目的はDLLからアップロード関数をexeにインポートして使用することです。ただし、エラーが発生した場合、アップロード機能はLog(char* str)関数を呼び出してエラーをログファイルに書き込む必要があります。

このDLLは複数のアプリケーションで使用する必要があり、各アプリケーションは異なる場所に異なるログファイルを持ちます。私はアプリケーションで定義されている対応するLog(char* str)を呼び出すような方法でDLLを書きたいと思います。同様に、アプリケーション固有の機能をいくつか持っていて、あらかじめDLLに含めることはできません。

このようなDLLコードは、関数プロトタイプのみを認識し、exeファイル内に存在する関数定義は認識できない場合は、どうすれば記述できますか?

+2

'ログイン(CHAR const * str) '、確かに? –

+0

多言語ソースファイルの作成は難しい作業です。私はあなたが1つの言語に固執することをお勧めします - あなたがそれを楽しくしていない限り。 – pmg

+2

または 'Log(const char * str)'? – trojanfoe

答えて

8

.exeが呼び出すことができるDLL内に、Log関数への関数ポインタを渡す関数があります。 DLLの内部では、その関数ポインタを格納し、それをログに記録する必要があるときに使用します。

このような関数がDLLに渡す必要がある場合は、structを使用してすべての関連する関数ポインタを格納することを検討してください。

ここで関数ポインタには良いチュートリアルです:The function pointer tutorial

はシンプルなこのインタフェースを保つために、私は非常に、少なくとも出発点として、平野Cに、これらすべての「カスタマイズ」の機能を保つことをお勧めします。メンバ関数へのポインタを扱い、C++オブジェクトをCラッパーの周りを渡すのはエラーが発生しやすいです。 (しかし実行可能です。)またはC++を一周してください。

ここに簡単な例があります。一般的なヘッダーでは、次のように入力します。

typedef void (*logfunc)(char const*); 

カスタマイズされた関数ポインタを簡単に渡すことができます。あなたのDLLのコードで

、あなたがして持っている可能性があり:

logfunc cust_log; 

void dll_init_logging(logfunc l) 
{ 
    cust_log = l; 
} 

void dll_do_something() 
{ 
    cust_log("hello"); 
} 

が必要な場合は、ご使​​用のプラットフォーム上でこれらの機能をエクスポートするためにそれを変更します。あなたのメインのコードから次に

、あなたは(あなたがDLLをロードすると、元の名前を使用して.exeファイルが利用できるエクスポート関数を作っていると仮定)する必要があるすべては、次のとおりです。

void logit(char const* str) 
{ 
    printf("Log: %s\n", str); 
} 

int main (int argc, char const *argv[]) 
{ 
    // load the DLL 
    dll_init_logging(logit); 
    ... 
    dll_do_something(); 
    ... 
    return 0; 
} 
+0

Thnks a lot。しかし、私はそれをCで実装する方法を100%確信しているわけではありません。** ".exeがあなたのLog関数への関数ポインタを渡して呼び出すことができるあなたのDLLに関数を持っています。その関数ポインタを格納して、それをログに記録する必要があるときに使用します。"**あなたの理解のためにコードスニペットを書くことができます – Shanty

+0

@Shanty:いくつかのサンプルコードを追加しました。おそらくダイナミックリンクでは動作しません - あなたのプラットフォームによって異なりますが、 ) – Mat

+0

@ Mat:ありがとう、これは私の問題を解決しました。 – Shanty

関連する問題