Hi, i found this very simple app which just pops up a window:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd, msg, wparam, lparam); } }
int WINAPI WinMain(HINSTANCE instance, HINSTANCE prev, LPSTR cmdLine, int cmdShow) { WNDCLASSEX class; MSG msg; HWND window;
/* this stuff is just boilerplate */ memset(&class, 0, sizeof(WNDCLASSEX)); class.cbSize = sizeof(WNDCLASSEX); class.hInstance = instance; class.lpszClassName = "MainWnd"; class.lpfnWndProc = WndProc; class.hbrBackground = (HBRUSH) COLOR_WINDOW + 1;
if (!RegisterClassEx(&class)) { MessageBox(NULL, "Could not register window class", "", MB_OK | MB_ICONERROR); return 1; }
window = CreateWindowEx(0, "MainWnd", "Main Window", WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 200, 150, NULL, NULL, instance, NULL); ShowWindow(window, cmdShow);
/* Every thread that creates a window must pump the message loop */ while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
return 0; }
Now i tried to implement this in a dll (avicap32.dll) in capCreatecapturewindow like this:
/*********************************************************************** * capCreateCaptureWindowW (AVICAP32.@) */ HWND VFWAPI capCreateCaptureWindowW(LPCWSTR lpszWindowName, DWORD dwStyle, INT x, INT y, INT nWidth, INT nHeight, HWND hWnd, INT nID) {
HWND ret; HINSTANCE dummy;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProcW(hwnd, msg, wparam, lparam); } }
int WINAPI Try(HINSTANCE instance, HINSTANCE prev, LPSTR cmdLine, int cmdShow) { WNDCLASSEXW class; MSG msg; HWND window;
/* this stuff is just boilerplate */ memset(&class, 0, sizeof(WNDCLASSEXW)); class.cbSize = sizeof(WNDCLASSEXW); class.hInstance = instance;
dummy=instance;
class.lpszClassName = "MainWnd"; class.lpfnWndProc = WndProc; class.hbrBackground = (HBRUSH) COLOR_WINDOW + 1;
if (!RegisterClassExW(&class)) { MessageBoxW(NULL, "Could not register window class", "", MB_OK | MB_ICONERROR); return 1; }
window = CreateWindowExW(0, "MainWnd", "Main Window", WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 200, 150, NULL, NULL, instance, NULL); ret=window; ShowWindow(window, cmdShow);
/* Every thread that creates a window must pump the message loop */ while (GetMessageW(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessageW(&msg);}
return 0; }
Try(dummy,NULL,NULL,0); return ret; }
Now when capcreatecapturewindow is called no window shows up at all. What did i do wrong? Greetings Robbert
:
___________________________________________________________ Moving house? Beach bar in Thailand? New Wardrobe? Win £10k with Yahoo! Mail to make your dream a reality. Get Yahoo! Mail www.yahoo.co.uk/10k
On Tue, 16 Nov 2004 14:16:58 +0000, luis lenders wrote:
Now when capcreatecapturewindow is called no window shows up at all. What did i do wrong?
If I had to take a guess, I'd say that gcc nested functions change the calling convention in use somehow ... you shouldn't be using them anyway, just move the wndproc outside the API call into a static function and put the code in try() into the API itself. Then run it with a +win trace and see if you can spot the APIs being used.
thanks -mike