能力值:
( LV12,RANK:250 )
|
-
-
2 楼
无论用BC还是VC,DLL入口想建窗口,必须开线程,在线程中建立窗口。
给你个BC的DEMO:
#include <vcl.h>
#include <windows.h>
#include "dlg.h"
#pragma hdrstop
#pragma argsused
typedef void __stdcall (*Pfun)(LPARAM);
HINSTANCE hInstance;
void __stdcall WinMain(LPARAM op1)
{
MainF = new TMainF(0);
MainF->ShowModal();
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
if(fwdreason == DLL_PROCESS_ATTACH)
{
hInstance = hinstDLL;
Pfun lpfunc = WinMain;
HANDLE hThread = CreateThread(0,0,(DWORD(__stdcall*)(void*))lpfunc,0,0,0);
CloseHandle(hThread);
}
return 1;
}
----注意,如果是把消息循环的处理交给类维护,需要使用ShowModal();否则线程立即结束,窗口一闪而逝。
如果是自建窗口,需要自建消息循环,以下是VC:
//================================================================
// 函数:注册窗口
//================================================================
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc= WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = 0;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = 0;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance,0);
return RegisterClassEx(&wcex);
}
//================================================================
// 函数:建立窗口并显示之
//================================================================
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hWnd = CreateWindow(szWindowClass,TEXT(""),WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)return FALSE;
mainhwnd = hWnd;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//================================================================
// 函数:建立窗口线程
//================================================================
DWORD WINAPI start(PVOID lParam)
{
MyRegisterClass(NULL);
if (!InitInstance(NULL,SW_HIDE))
{
MessageBox(0,TEXT("窗口初始化失败!"),szWindowClass,MB_ICONSTOP);
return 0;
}
MSG msg;
while(GetMessage(&msg,NULL,0,0))DispatchMessage(&msg);
return (int) msg.wParam;
}
//================================================================
// 函数:窗口消息回调
// 主要做Socket通讯
// 说明一下WM_DESTROY:
// 自行处理WM_CLOSE消息时需要DestoryWindow(hWnd);
// 并PostQuitMessage(0);
// 而交给DefWindowProc处理,则自动调用DestoryWindow(hWnd);
// 那个函数也是发送WM_DESTROY消息。
// SDK里说,两个消息,至少处理一个。这是IDE自建的,只是说明一下。
//================================================================
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
.... case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
可惜啊可惜,没有分拿。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
好详细啊,太感谢了!!!!!:D
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
|