2009-05-09 10 views
3

登録情報機能を持つWin32 DLLを繰り返し生成する必要があります。この関数は、リテラルを使用して顧客固有の登録情報を返します。顧客ごとに個別のDLLが構築されます。C Win32 DLLをプログラムで生成する

私は、1カスタマーのためのハードコードされた情報で正しく動作するテストバージョンを持っています。いくつかのサイトの緊急性は私が手動でDLLをいくつか生成するように指示していますが、クライアントに動的にCソースを出し、必要に応じてDLLを作成するアプリケーションを提供したいと思います。

これを行うにはどうすればよいでしょうか?私はVS 2008 C++ Expressを持っているので、cl.exeコンパイラがあります。私の現在のアプローチは、Cソースの文字列定数を持つC#アプリケーションを作成してから生成する前に、必要なパラメータでトークンを置き換え、cl.exeを実行して実行してビルドしてリンクします。

string UserName = "PLACEHOLDER UserName      "; 
string RegCode = "PLACEHOLDER RegCode      "; 
bool CheckRegistration(string UserName, RegCode) { 
    ... 
} 

.dllファイルにこれをコンパイルします。

+0

cl.exeは自由に配布可能ですか?あなたのソフトウェアのユーザーがコピーを持っていることをどのように確認しますか? –

+0

@Neil:IIRCそうではありません。しかし、それは自由にダウンロードできます。 – Richard

答えて

1

リテラルを#define sと定義し、ヘッダファイルを生成するだけです。自動化されたビルドシステムが残りの部分を処理します。

2

私の一般的な考え方は、このようなプログラムを持つことです。各ユーザーについて、.dllファイルをロードし、その中に2つのPLACEHOLDERを見つけて、それらを実際のユーザーデータで置き換えます。文字列をスペースで埋めてください。

0

私は、生成する必要があるDLLのほとんどがまったく同じものであり、変更が唯一のものは顧客単位のデータであり、文字列であると仮定します。これが当てはまる場合、これを行う最も簡単な方法は、コード内に大きな文字列配列を追加して、それを既知のユニークなパターンで埋めることです。 "MYSTART-------------MYEND"と言ってDLLをコンパイルしてください。
クライアントごとのDLLを生成するには、DLLを実際に再コンパイルする必要はなく、一意の文字列をクライアント単位の文字列に置き換えるだけです。置き換える文字列が、ファイルにバイトを追加しないように、コードで追加した文字列と同じサイズであることを確認する必要があります。
16進エディタを使用するか、3行のpython/perlスクリプトを使用して、この検索と置換を手動で行うことができます。

2

.NETツール(特にコンパイラ)は、.NET Frameworkのインストールに含まれています。 DLLがネイティブのWin32でなくても、Code DOMとフレームワークサポートを使用してマネージドDLLを動的に作成する必要がない場合は、

Win32から.NETにブリッジするには、COMが最も簡単な方法ですが、これには登録が必要です。動的DLLが登録を必要としないようにするには、COMインタフェースを公開してアプリケーションで配布し、インストール時に登録するブリッジ管理されたdllを作成します。それは、動的に作成されたdllを読み込みます(作成することもできます)。

このようにすると、cl.exeとlink.exeのWin32 SDK(または他のルート)がインストールされていることを確認する必要がなくなります。

5

文字列リソースとしてすべての顧客情報を.rcファイルに保存します。対応する.resファイルをDLLにリンクします。その顧客情報に依存するDLL内のすべてのコードは、LoadStringを呼び出してこれを取得します。

その後、Win32 API:BeginUpdateResource、UpdateResourceなどを使用する「UpdateDLL.exe」という別のプログラム(または関数)をビルドして、新しい情報でDLLを更新します。次

船:

  1. リソースで顧客情報のため、空の(またはデフォルト)の文字列を持っている、プリコンパイルされたDLL。

  2. DLL名と顧客情報ファイルをコマンドラインパラメータとして使用するUpdateDLL.exeツール。

  3. 顧客は "UpdateDLL.exe customer.dll myinfo.txt"を実行して、DLLのコピーを自分の情報で更新します。

+0

@selbie、これは素晴らしい考えです。ありがとう! – ProfK

関連する問題