317 lines
7.4 KiB
C++
317 lines
7.4 KiB
C++
|
/***
|
||
|
*disptest.c - IDispatch test driver.
|
||
|
*
|
||
|
* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
|
||
|
* Information Contained Herein Is Proprietary and Confidential.
|
||
|
*
|
||
|
*Purpose:
|
||
|
* This module contains the entry point for the IDispatch test app.
|
||
|
*
|
||
|
* iid.cpp - allocation of the ITestSuite IID
|
||
|
* dtmisc.cpp - misc helpers and utilities
|
||
|
* cbstr.cpp - CBstrSuite
|
||
|
* cwbstr.cpp - CWBstrSuite (WIN32 Only)
|
||
|
* ctime.cpp - CTimeSuite
|
||
|
* cdatecnv.cpp = CDateCoersionSuite
|
||
|
* cvariant.cpp - CVariantSuite
|
||
|
* csarray.cpp - CSafeArraySuite
|
||
|
* cinvval.cpp - CInvokeByValSuite
|
||
|
* cinvref.cpp - CInvokeByRefSuite
|
||
|
* cinvmult.cpp - CInvokeMultipleSuite
|
||
|
* cinvsary.cpp - CInvokeSafeArraySuite
|
||
|
* cinvex.cpp - CInvokeExcepinfoSuite
|
||
|
* ccollect.cpp - CCollectionSuite
|
||
|
* cearly.cpp - CEarlySuite
|
||
|
*
|
||
|
* REVIEW: tests still needed for the following,
|
||
|
* heterogeneous variant arrays - csarray/cinvsary
|
||
|
*
|
||
|
*Revision History:
|
||
|
*
|
||
|
* [00] 23-Sep-92 bradlo: Added header.
|
||
|
*
|
||
|
*Implementation Notes:
|
||
|
*
|
||
|
*****************************************************************************/
|
||
|
|
||
|
#include "disptest.h"
|
||
|
#include "tstsuite.h"
|
||
|
|
||
|
ASSERTDATA
|
||
|
|
||
|
STDAPI_(void) PassFail(HRESULT, OLECHAR FAR*, HWND);
|
||
|
STDAPI DispTestAll(HWND, int, int);
|
||
|
STDAPI DispTestOne(HWND, int);
|
||
|
|
||
|
BOOL InitApplication(HINSTANCE hinst);
|
||
|
BOOL InitInstance(HINSTANCE hist, int nCmdShow);
|
||
|
|
||
|
extern "C" BOOL CALLBACK EXPORT
|
||
|
AboutDlgProc(HWND, unsigned, WORD, LONG);
|
||
|
|
||
|
extern "C" LRESULT CALLBACK EXPORT
|
||
|
MainWndProc(HWND, UINT, WPARAM, LPARAM);
|
||
|
|
||
|
|
||
|
int g_fTrace = FALSE;
|
||
|
int g_fNamed = FALSE;
|
||
|
int g_fMultiThread = FALSE;
|
||
|
int g_fDetectLeaks = FALSE;
|
||
|
|
||
|
HINSTANCE g_hinst; // current instance
|
||
|
|
||
|
HWND g_hwnd = NULL;
|
||
|
|
||
|
TCHAR g_szFrameWinClass[] = TSTR("DispTestWinClass");
|
||
|
|
||
|
#if OE_WIN32
|
||
|
CRITICAL_SECTION g_csDbPrintf;
|
||
|
#endif // OE_WIN32
|
||
|
|
||
|
/***
|
||
|
*int WinMain(HANDLE, HANDLE, LPSTR, int)
|
||
|
*Purpose:
|
||
|
* Windows recognizes this function by name as the initial entry
|
||
|
* point for the program
|
||
|
*
|
||
|
*Entry:
|
||
|
* hinst = instance handle of this instance
|
||
|
* hinstPrev = instance handle of previous running instance (if any)
|
||
|
* lpszCmdLine = command line passed to the program
|
||
|
* nCmdShow = how to show the main window
|
||
|
*
|
||
|
*Exit:
|
||
|
* return value = int, exit status of the program
|
||
|
*
|
||
|
***********************************************************************/
|
||
|
extern "C" int PASCAL
|
||
|
WinMain(
|
||
|
HINSTANCE hinst,
|
||
|
HINSTANCE hinstPrev,
|
||
|
LPSTR lpCmdLine,
|
||
|
int nCmdShow)
|
||
|
{
|
||
|
MSG msg;
|
||
|
|
||
|
if(!hinstPrev)
|
||
|
if(!InitApplication(hinst))
|
||
|
return FALSE;
|
||
|
|
||
|
#if OE_WIN32
|
||
|
if(strstr(lpCmdLine, "-detectleaks"))
|
||
|
#else
|
||
|
if(STRSTR(lpCmdLine, "-detectleaks"))
|
||
|
#endif
|
||
|
g_fDetectLeaks = TRUE;
|
||
|
|
||
|
if(InitOle() != NOERROR)
|
||
|
return FALSE;
|
||
|
|
||
|
if(!InitInstance(hinst, nCmdShow) || !InitAppData()) {
|
||
|
UninitOle();
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
#if OE_WIN32
|
||
|
InitializeCriticalSection(&g_csDbPrintf);
|
||
|
#endif // OE_WIN32
|
||
|
|
||
|
#if OE_WIN32
|
||
|
if(strstr(lpCmdLine, "-all"))
|
||
|
#else
|
||
|
if(STRSTR(lpCmdLine, "-all"))
|
||
|
#endif
|
||
|
{ DispTestAll(g_hwnd, FALSE, FALSE); PostQuitMessage(0); }
|
||
|
|
||
|
while(GetMessage(&msg, NULL, NULL, NULL)) {
|
||
|
TranslateMessage(&msg);
|
||
|
DispatchMessage(&msg);
|
||
|
}
|
||
|
|
||
|
ReleaseAppData();
|
||
|
UninitOle();
|
||
|
|
||
|
return msg.wParam; /* Returns the value from PostQuitMessage */
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
InitApplication(HINSTANCE hinst)
|
||
|
{
|
||
|
WNDCLASS wc;
|
||
|
|
||
|
wc.style = NULL;
|
||
|
wc.lpfnWndProc = MainWndProc;
|
||
|
wc.cbClsExtra = 0;
|
||
|
wc.cbWndExtra = 0;
|
||
|
wc.hInstance = hinst;
|
||
|
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
|
||
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||
|
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
|
||
|
wc.lpszMenuName = TSTR("DispTestMenu");
|
||
|
wc.lpszClassName = g_szFrameWinClass;
|
||
|
if(!RegisterClass(&wc))
|
||
|
return FALSE;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
#ifdef WIN32
|
||
|
#define szAppTitle TSTR("IDispatch Test App (32-bit)")
|
||
|
#else //WIN32
|
||
|
#define szAppTitle TSTR("IDispatch Test App")
|
||
|
#endif //WIN32
|
||
|
|
||
|
BOOL
|
||
|
InitInstance(HINSTANCE hinst, int nCmdShow)
|
||
|
{
|
||
|
HWND hwnd;
|
||
|
|
||
|
g_hinst = hinst;
|
||
|
|
||
|
/* Create a main window for this application instance. */
|
||
|
|
||
|
hwnd = CreateWindow(
|
||
|
g_szFrameWinClass,
|
||
|
szAppTitle, // title bar text
|
||
|
WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX, // window style
|
||
|
CW_USEDEFAULT, // horizontal position
|
||
|
CW_USEDEFAULT, // vertical position
|
||
|
550, // width position
|
||
|
100, // height position
|
||
|
NULL, // no parent
|
||
|
NULL, // use the window class menu
|
||
|
hinst, // this instance owns this window
|
||
|
NULL); // pointer not needed
|
||
|
|
||
|
if(!hwnd)
|
||
|
return FALSE;
|
||
|
|
||
|
#if OE_WIN16
|
||
|
// Multithreading is not availible on WIN16.
|
||
|
// UNDONE: Grey this for WIN32s.
|
||
|
//
|
||
|
EnableMenuItem(GetMenu(hwnd), IDM_OPTIONS_MULTITHREAD, MF_DISABLED);
|
||
|
#endif // OE_WIN16
|
||
|
|
||
|
ShowWindow(hwnd, nCmdShow);
|
||
|
UpdateWindow(hwnd);
|
||
|
|
||
|
g_hwnd = hwnd;
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/***
|
||
|
*BOOL AboutDlgProc(HWND, unsigned, WORD, LONG)
|
||
|
*Purpose:
|
||
|
* The "about" dialog box procedure.
|
||
|
*
|
||
|
*Entry:
|
||
|
* hwndDlg = window handle for the dialog box
|
||
|
* message = the window message
|
||
|
* wparam = message data
|
||
|
* lparam = message data
|
||
|
*
|
||
|
*Exit:
|
||
|
* return value = BOOL. TRUE if processed message, FALSE if not
|
||
|
*
|
||
|
***********************************************************************/
|
||
|
extern "C" BOOL CALLBACK EXPORT
|
||
|
AboutDlgProc(HWND hwndDlg, unsigned message, WORD wparam, LONG lparam)
|
||
|
{
|
||
|
switch(message){
|
||
|
case WM_INITDIALOG: /* message: initialize dialog box */
|
||
|
return TRUE;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
if(wparam == IDOK || wparam == IDCANCEL){
|
||
|
EndDialog(hwndDlg, TRUE);
|
||
|
return TRUE;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
extern "C" LRESULT CALLBACK EXPORT
|
||
|
MainWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
|
||
|
{
|
||
|
BOOL fChk;
|
||
|
HMENU hmenu;
|
||
|
static DLGPROC pfnAboutDlgProc;
|
||
|
HRESULT hresult;
|
||
|
|
||
|
switch(message){
|
||
|
case WM_COMMAND:
|
||
|
switch(wparam){
|
||
|
case IDM_OPTIONS_MULTITHREAD:
|
||
|
fChk = g_fMultiThread = (g_fMultiThread) ? FALSE : TRUE;
|
||
|
goto LCheckMark;
|
||
|
|
||
|
case IDM_OPTIONS_TRACE:
|
||
|
fChk = g_fTrace = (g_fTrace) ? FALSE : TRUE;
|
||
|
goto LCheckMark;
|
||
|
|
||
|
case IDM_OPTIONS_NAMED:
|
||
|
fChk = g_fNamed = (g_fNamed) ? FALSE : TRUE;
|
||
|
|
||
|
LCheckMark:;
|
||
|
hmenu = GetMenu(hwnd);
|
||
|
CheckMenuItem(hmenu, wparam, fChk ? MF_CHECKED : MF_UNCHECKED);
|
||
|
return 0;
|
||
|
|
||
|
case IDM_ALL:
|
||
|
hresult = DispTestAll(hwnd, TRUE, g_fMultiThread);
|
||
|
|
||
|
// If S_FALSE is returned, we've already displayed an error, so
|
||
|
// don't do it again.
|
||
|
//
|
||
|
if (GetScode(hresult) != S_FALSE) {
|
||
|
PassFail(hresult, OLESTR("Test All"), hwnd);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
case IDM_SUITE_BSTR:
|
||
|
#if OE_WIN32 && 0
|
||
|
case IDM_SUITE_WBSTR:
|
||
|
#endif
|
||
|
case IDM_SUITE_TIME:
|
||
|
case IDM_SUITE_DATECNV:
|
||
|
case IDM_SUITE_VARIANT:
|
||
|
case IDM_SUITE_SAFEARRAY:
|
||
|
case IDM_SUITE_NLS:
|
||
|
case IDM_SUITE_BIND:
|
||
|
case IDM_SUITE_INVOKE_BYVAL:
|
||
|
case IDM_SUITE_INVOKE_BYREF:
|
||
|
case IDM_SUITE_INVOKE_SAFEARRAY:
|
||
|
case IDM_SUITE_INVOKE_EXCEPINFO:
|
||
|
case IDM_SUITE_COLLECTION:
|
||
|
#if VBA2
|
||
|
case IDM_SUITE_EARLY:
|
||
|
#endif
|
||
|
DispTestOne(hwnd, wparam);
|
||
|
return 0;
|
||
|
|
||
|
case IDM_HELP_ABOUT:
|
||
|
pfnAboutDlgProc =
|
||
|
(DLGPROC)MakeProcInstance((DLGPROC)AboutDlgProc, g_hinst);
|
||
|
DialogBox(g_hinst, TSTR("AboutBox"), hwnd, pfnAboutDlgProc);
|
||
|
FreeProcInstance(pfnAboutDlgProc);
|
||
|
return 0;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_CLOSE:
|
||
|
DestroyWindow(hwnd);
|
||
|
return 0;
|
||
|
|
||
|
case WM_DESTROY: /* message: window being destroyed */
|
||
|
PostQuitMessage(0);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
return DefWindowProc(hwnd, message, wparam, lparam);
|
||
|
}
|