Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Tạo window trong win32 dll như thế nào?

  1. #1
    Ngày gia nhập
    04 2011
    Bài viết
    31

    Mặc định Tạo window trong win32 dll như thế nào?

    mình biết cách create window từ win32 app, nhưng lại không làm được trong dll.
    có ai tạo được window từ 1 hàm trong dll không, demo giúp mình với.
    vidu:
    tạo một win32 dll
    trong dll export 1 hàm (start)
    trong hàm start() tạo một window bất kì.

    ai biết thì chỉ mình với, làm hoài khôn được.
    cám ơn nhiều.

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,749

    Bạn cần tạo 1 thread rồi tạo window trong thread đó, bạn cần kiểm tra sự tồn tại của thread hoặc window bạn đã tạo.

    Sau đây là một ví dụ:

    Visual C++ Code:
    1. #include "stdafx.h"
    2. #include "windows.h"
    3.  
    4. #define MYMENU_EXIT         (WM_APP + 101)
    5. #define MYMENU_MESSAGEBOX   (WM_APP + 102)
    6.  
    7. HINSTANCE  inj_hModule;          //Injected Modules Handle
    8. HWND       prnt_hWnd;            //Parent Window Handle
    9.  
    10. //WndProc for the new window
    11. LRESULT CALLBACK DLLWindowProc (HWND, UINT, WPARAM, LPARAM);
    12.  
    13. //Register our windows Class
    14. BOOL RegisterDLLWindowClass(wchar_t szClassName[])
    15. {
    16.     WNDCLASSEX wc;
    17.     wc.hInstance =  inj_hModule;
    18.     wc.lpszClassName = (LPCWSTR)L"InjectedDLLWindowClass";
    19.     wc.lpszClassName = (LPCWSTR)szClassName;
    20.     wc.lpfnWndProc = DLLWindowProc;
    21.     wc.style = CS_DBLCLKS;
    22.     wc.cbSize = sizeof (WNDCLASSEX);
    23.     wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    24.     wc.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    25.     wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    26.     wc.lpszMenuName = NULL;
    27.     wc.cbClsExtra = 0;
    28.     wc.cbWndExtra = 0;
    29.     wc.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    30.     if (!RegisterClassEx (&wc))
    31.         return 0;
    32. }
    33. //Creating our windows Menu
    34. HMENU CreateDLLWindowMenu()
    35. {
    36.     HMENU hMenu;
    37.     hMenu = CreateMenu();
    38.     HMENU hMenuPopup;
    39.     if(hMenu==NULL)
    40.         return FALSE;
    41.     hMenuPopup = CreatePopupMenu();
    42.     AppendMenu (hMenuPopup, MF_STRING, MYMENU_EXIT, TEXT("Exit"));
    43.     AppendMenu (hMenu, MF_POPUP, (UINT_PTR) hMenuPopup, TEXT("File"));
    44.  
    45.     hMenuPopup = CreatePopupMenu();
    46.     AppendMenu (hMenuPopup, MF_STRING,MYMENU_MESSAGEBOX, TEXT("MessageBox"));
    47.     AppendMenu (hMenu, MF_POPUP, (UINT_PTR) hMenuPopup, TEXT("Test"));
    48.     return hMenu;
    49. }
    50.  
    51. //The new thread
    52. DWORD WINAPI ThreadProc( LPVOID lpParam )
    53. {
    54.     MSG messages;
    55.     wchar_t *pString = reinterpret_cast<wchar_t * > (lpParam);
    56.     HMENU hMenu = CreateDLLWindowMenu();
    57.     RegisterDLLWindowClass(L"InjectedDLLWindowClass");
    58.     prnt_hWnd = FindWindow(L"Window Injected Into ClassName", L"Window Injected Into Caption");
    59.     HWND hwnd = CreateWindowEx (0, L"InjectedDLLWindowClass", pString, WS_EX_PALETTEWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, prnt_hWnd, hMenu,inj_hModule, NULL );
    60.     ShowWindow (hwnd, SW_SHOWNORMAL);
    61.     while (GetMessage (&messages, NULL, 0, 0))
    62.     {
    63.         TranslateMessage(&messages);
    64.         DispatchMessage(&messages);
    65.     }
    66.     return 1;
    67. }
    68. //Our new windows proc
    69. LRESULT CALLBACK DLLWindowProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    70. {
    71.     switch (message)
    72.     {
    73.         case WM_COMMAND:
    74.                switch(wParam)
    75.                {
    76.                     case MYMENU_EXIT:
    77.                         SendMessage(hwnd, WM_CLOSE, 0, 0);
    78.                         break;
    79.                     case MYMENU_MESSAGEBOX:
    80.                         MessageBox(hwnd, L"Test", L"MessageBox",MB_OK);
    81.                         break;
    82.                }
    83.                break;
    84.         case WM_DESTROY:
    85.             PostQuitMessage (0);
    86.             break;
    87.         default:
    88.             return DefWindowProc (hwnd, message, wParam, lParam);
    89.     }
    90.     return 0;
    91. }
    92.  
    93. BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call,LPVOID lpReserved)
    94. {
    95.     if(ul_reason_for_call==DLL_PROCESS_ATTACH) {
    96.         inj_hModule = hModule;
    97.         CreateThread(0, NULL, ThreadProc, (LPVOID)L"Window Title", NULL, NULL);
    98.     }
    99.     return TRUE;
    100. }
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  3. #3
    Ngày gia nhập
    04 2011
    Bài viết
    31

    cám ơn bạn nhiều lắm, chạy được rồi

  4. #4
    Ngày gia nhập
    09 2010
    Bài viết
    16

    anh ơi cho em hỏi thế nếu mình ko muốn tạo window mà chỉ muốn tạo dialog trong dll thì thế nào ạ?

Các đề tài tương tự

  1. Kết nối và thao tác ADO với SQL trong win32 ?
    Gửi bởi PhuongSmith trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 09-03-2013, 11:36 AM
  2. Làm thế nào để tạo một OpenGL Window bên trong một Main Window?
    Gửi bởi bachhaiduong trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 10-01-2012, 10:09 AM
  3. Cách viết bàn cờ trong Win32 API như thế nào?
    Gửi bởi macgyver_canary trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 06-05-2011, 10:46 PM
  4. Cách sử dụng rebar trong Win32 API như thế nào?
    Gửi bởi long_long trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 1
    Bài viết cuối: 28-03-2011, 12:54 PM
  5. Làm thế nào để mở 1 ứng dụng trong Win32
    Gửi bởi ddhung trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 10-05-2010, 08:57 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn