VS 2008でEXEプログラムをDLLに変換
つのMFCプロジェクトは半分まで行って、インタフェースはすべて设计して、指导(者)は突然言って、DLLのをして、NND、1つの言叶、十分に人を振り回して、インタフェースはやり直して、前は2日使って、今また2日を必要として、この时间は谁があげますか?その时、プロジェクトが时间通りに完成できないのは、あなたの仕事が速くないのを責めて、またあなたに質問して、あなたは前の仕事が蓄積していませんか?こんな簡単なことを、こんなに長くやるの?私はある言叶がとても良いと感じて、教えることができない学生がなくて、教えることができない先生だけあって、あるいは先生が教える方法が間違っています;言い換えれば、戦争ができない兵士はなく、指揮ができない将校しかいない.亮剣の中の李雲龍は私はとても好きで、何度も見て、すべてとても好きです.この人は、本当に、仕事ができて、仕事ができると思います.今はぶらぶらできる人がたくさんいますが、本当に仕事ができる人はそんなに多くありません.だから、効率は残業してどのくらいの時間で向上できるというわけではありません.主に合理的な計画と手配があります.そうすれば、秩序正しく、順番に仕事をすることができます.
本題に戻り、EXEプログラムをDllに変換する方法について話しましょう.
1.まずDLLの工事を建てます.
2.そしてexeエンジニアリングのファイル(cpp、h、rcなど)をコピーします.
3.DLL工程目録の下のXXXXXX.rcをDLL対応のrcファイルに変更し、前の削除を行います.resディレクトリの下には名前を変更する必要はありません.
4.Dllエンジニアリングにファイルをコンパイルします.
5.元工事Cxx.hのクラスはCWinAppから継承され、WinMain()関数が隠されていますが、dllプロジェクトを新規作成するにも独自のWinMain()エントリがあり、インポートする元のプロジェクトのCxxを必要とします.hの関連クラスを修正する:
削除:public CWinApp;
削除:virtual BOOL InitInstance();
削除:DECLARE_MESSAGE_MAP().
追加コードは次のとおりです.
7.テストエンジニアリングを作成し、ボタンイベントを追加し、次のコードを追加します.
8.テストエンジニアリングとdllをコンパイルし、dllをエンジニアリングデバッグディレクトリにコピーすると、テスト中にクラッシュする問題があり、parentポインタが空でないことを確認します.
解決策の1つは、次のとおりです.
DLLエンジニアリング:
右クリックエンジニアリング->プロパティ->構成プロパティ->Generalは、エンジニアリングのデフォルトのUse of MFCをUse MFC in a Static Libraryに変更します.
このメソッドでコンパイルされたファイルは比較的大きいです.
解決策の2つ目は、
9.関数ポインタ定義の問題:
ここではFARPROCを使いましたが、これはパラメータがありません.パラメータがあれば、どのように定義すればいいですか.
DLLにおけるWENTはC言語呼び出し仕様として定義されているため、MYWENTの前には必ず_cdecl、VCでよく使われる_stdcallはPASCAL呼び出し仕様で、できません.注意しなければなりません.例は次のとおりです.
typedef void (FAR __cdecl *MYWENT)(CWnd*);
MYWENT proc;
転載はオリジナルリンクを明記してください:http://blog.csdn.net/wujunokay/article/details/12971749
本題に戻り、EXEプログラムをDllに変換する方法について話しましょう.
1.まずDLLの工事を建てます.
2.そしてexeエンジニアリングのファイル(cpp、h、rcなど)をコピーします.
3.DLL工程目録の下のXXXXXX.rcをDLL対応のrcファイルに変更し、前の削除を行います.resディレクトリの下には名前を変更する必要はありません.
4.Dllエンジニアリングにファイルをコンパイルします.
5.元工事Cxx.hのクラスはCWinAppから継承され、WinMain()関数が隠されていますが、dllプロジェクトを新規作成するにも独自のWinMain()エントリがあり、インポートする元のプロジェクトのCxxを必要とします.hの関連クラスを修正する:
削除:public CWinApp;
削除:virtual BOOL InitInstance();
削除:DECLARE_MESSAGE_MAP().
追加コードは次のとおりです.
extern "C" __declspec(dllexport) void ShowDlg(void)
{
CXXXXXDlg dlg;
dlg.DoModal();
}
7.テストエンジニアリングを作成し、ボタンイベントを追加し、次のコードを追加します.
HINSTANCE hDll; //DLL
hDll = LoadLibrary(_T("XXXXDLL.dll"));
if (NULL == hDll)
{
MessageBox(_T("DLL "));
}
else
{
FARPROC proc;
proc = GetProcAddress(hDll,"ShowDlg");//
proc();
}
8.テストエンジニアリングとdllをコンパイルし、dllをエンジニアリングデバッグディレクトリにコピーすると、テスト中にクラッシュする問題があり、parentポインタが空でないことを確認します.
解決策の1つは、次のとおりです.
DLLエンジニアリング:
右クリックエンジニアリング->プロパティ->構成プロパティ->Generalは、エンジニアリングのデフォルトのUse of MFCをUse MFC in a Static Libraryに変更します.
このメソッドでコンパイルされたファイルは比較的大きいです.
解決策の2つ目は、
extern "C" __declspec(dllexport) void ShowDlg(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());//
CXXXXXDlg dlg;
dlg.DoModal();
}
9.関数ポインタ定義の問題:
ここではFARPROCを使いましたが、これはパラメータがありません.パラメータがあれば、どのように定義すればいいですか.
DLLにおけるWENTはC言語呼び出し仕様として定義されているため、MYWENTの前には必ず_cdecl、VCでよく使われる_stdcallはPASCAL呼び出し仕様で、できません.注意しなければなりません.例は次のとおりです.
typedef void (FAR __cdecl *MYWENT)(CWnd*);
MYWENT proc;
転載はオリジナルリンクを明記してください:http://blog.csdn.net/wujunokay/article/details/12971749