- ベストアンサー
DLLでフォームを持ちたい
C++6.0で開発しています。 DLLでフォームを持ちたいのですが、どうやるのでしょうか? 親プログラム(VB6.0)からメッセージボックスではなくてWindowsフォームを呼び出したいのですが、よくわかりません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
VC6.0ですが、以下のようなプログラムでDLLを作成しCALL_WINをよびだせば別Windowを呼び出せます ウィンドーズの各コンポーネントはプログラムで定義することになります さらに実用化するには相当の力量が必要かと思いますが 試行錯誤すればよいかなと思います *********************************************************** <PRE> #include <windows.h> #include <windowsx.h> #define DLLIMPORT __declspec(dllimport) #define DLLEXPORT __declspec(dllexport) HWND hWndMain=NULL; LPSTR szAppName="GENERIC"; HINSTANCE hMyInstance; //#pragma argsused LRESULT APIENTRY WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { LRESULT r = 0; switch(msg) { case WM_CREATE: hWndMain = hwnd; break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; case WM_COMMAND: switch(GET_WM_COMMAND_ID(wParam, lParam)) { //何らかの入力処理 default: break; } break; default: r = DefWindowProc(hwnd,msg,wParam,lParam); } return (r); } int DLLEXPORT CALL_WIN() { MSG m; WNDCLASS c; if (hWndMain != NULL) return(0); c.style = CS_HREDRAW | CS_VREDRAW; c.lpfnWndProc = WndProc; c.cbClsExtra = 0; c.cbWndExtra = 0; c.hInstance = GetModuleHandle(NULL); c.hIcon = LoadIcon(NULL,IDI_APPLICATION); c.hCursor = LoadCursor(NULL,IDC_ARROW); c.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); c.lpszMenuName = NULL; c.lpszClassName = szAppName; RegisterClass(&c); CreateWindow(szAppName ,szAppName ,WS_OVERLAPPEDWINDOW ,CW_USEDEFAULT ,CW_USEDEFAULT ,CW_USEDEFAULT ,CW_USEDEFAULT ,NULL ,NULL ,c.hInstance ,NULL ); ShowWindow(hWndMain,SW_SHOWDEFAULT); while (GetMessage (&m, NULL, 0, 0)) { TranslateMessage (&m); DispatchMessage (&m); } hWndMain = NULL; return(m.wParam); } int APIENTRY DllMain(HINSTANCE hInst ,ULONG ul_reason_for_call ,LPVOID lpReserved ) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: break; case DLL_THREAD_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_DETACH: break; default: break; } return 1; } </PRE> ******************************************************************
その他の回答 (1)
- gyrocompas
- ベストアンサー率23% (24/104)
(I)DLLの作成法 (1)VC6を立ち上げる (2)[ファイル]->[新規作成]とメニューを選択すると[新規作成]ダイログが表示される。 (3)[プロジェクト]タブを選択すると、左半分にプロジェクトタイプの一覧が表示されているので Win32 Dynamic-Link Library 選択する。 (4) ダイアログの右半分の[プロジェクト名]にWinSubEx(ここではこの名前にします、好きな名前にして下さい) 右下の[プラットフォーム]の[Win32]がチェックされていることを確認し[OK]ボタンを押すと ダイアログが[Win32 Dynamic Link Library ステップ 1/1]に変わる (5) [空のDLLプロジェクト]をチェックし[終了]ボタンを押す [新規プロジェクト情報]ダイアログが表示されるので[OK]を押す。 (6)前出のソースをエディターにて打ち込むか、カット&ペーストして (4)にてWinSubExというディレクトリーが作成されるのでそのディレクトリー下にWinSubEx.cという名前でセーブする。 (6) VC6に戻り、メインメニューの[プロジェクト]->[プロジェクトに追加]->[ファイル]を選択すると [プロジェクトへファイルを追加]ダイアログを表示される。 ファイルの一覧の中にWinSubEx.cがあるはずなのでその名前を左クリックして選択すると [ファイル名]にWinSubEx.cが表示されたら[OK]ボタンを押す。 (7)メインメニューの[ビルド]->[ビルド]を選択するとWinSubExの下にDebugディレクトリが作成されその下のWinSubEx.DLLが作成されているはずです。 注]ちなみにウィザードは使用しません。 (II)VBでの使用方法 (1)宣言方法 標準モジュールにて Public Declare Function CALL_WIN Lib "WinSubEx.dll" () As Integer と宣言する。 (2)呼び出し方法 たとえばボタンを押して呼び出したい時 Private Sub Command1_Click() CALL_WIN End Sub 注]WinSubEx.DLLをVBと同じディレクトリ下に置く(コピーする)ことが必要です。
お礼
どうもありがとうございました。 無事動きました。 おかげさまで助かりました。
お礼
どうもありがとうございます。 「Win32 Dynamic-Link Library」-「空のDLL プロジェクト」でウィザードを立ち上げるんでしょうか?
補足
すみません。 「Win32 Dynamic-Link Library」-「空のDLL プロジェクト」でウィザードを立ち上げてやってみました。 VB6.0にて 標準モジュールに Declare Sub CALL_WIN Lib "CallWinDLL.dll" () と宣言して、フォームにボタンを置き以下のように呼び出しましたが、 「実行時エラー'453';エントリCALL_WINがDLLファイルCallWinDLL.dll内に見つかりません。」と出てきます。何か足りないのでしょうか? Private Sub Command1_Click() Call CALL_WIN End Sub