• ベストアンサー

DLLでフォームを持ちたい

C++6.0で開発しています。 DLLでフォームを持ちたいのですが、どうやるのでしょうか? 親プログラム(VB6.0)からメッセージボックスではなくてWindowsフォームを呼び出したいのですが、よくわかりません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

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> ******************************************************************

ultraok
質問者

お礼

どうもありがとうございます。 「Win32 Dynamic-Link Library」-「空のDLL プロジェクト」でウィザードを立ち上げるんでしょうか?

ultraok
質問者

補足

すみません。 「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

その他の回答 (1)

回答No.2

(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と同じディレクトリ下に置く(コピーする)ことが必要です。

ultraok
質問者

お礼

どうもありがとうございました。 無事動きました。 おかげさまで助かりました。

関連するQ&A