|
|
// The CPL basics
#include "precomp.h"
// Prototypes
LONG OnCPlInit(); LONG OnCPlGetCount(); LONG OnCPlInquire( int i, CPLINFO * pci ); LONG OnCPlDblClk( int i, HWND hwndParent, LPTSTR pszCmdLine ); LONG OnCPlStop( int i, LPARAM lData ); LONG OnCPlExit();
void DisplayDialingRulesPropertyPage(HWND hwndCPl, int iTab);
// Global Variables
HINSTANCE g_hInst;
// DllMain
//
// This is the DLL entry point, called whenever the DLL is loaded.
extern "C" BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved ) { // Perform actions based on the reason for calling.
switch( fdwReason ) { case DLL_PROCESS_ATTACH: g_hInst = hinstDLL; break;
case DLL_THREAD_ATTACH: // Do thread-specific initialization.
break;
case DLL_THREAD_DETACH: // Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH: // Perform any necessary cleanup.
break;
default: break; } return TRUE; // Successful DLL_PROCESS_ATTACH.
}
// CPlApplet
//
// This is the main entry point for a CPl applet. This exported function
// is called by the control panel.
LONG APIENTRY CPlApplet( HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2 ) { switch (uMsg ) { case CPL_INIT: return OnCPlInit();
case CPL_GETCOUNT: return OnCPlGetCount();
case CPL_INQUIRE: return OnCPlInquire((int)lParam1, (CPLINFO*)lParam2);
case CPL_DBLCLK: lParam2 = 0; //fall through
case CPL_STARTWPARMS: return OnCPlDblClk((int)lParam1, hwndCPl, (LPTSTR)lParam2);
case CPL_STOP: return OnCPlStop((int)lParam1, lParam2);
case CPL_EXIT: return OnCPlExit(); }
return 0; }
// OnCPlInit
//
// Before any required initialization.
// Return zero to abort the CPl and non-zero on successful initialization.
LONG OnCPlInit() { return (0 == GetSystemMetrics (SM_CLEANBOOT))?TRUE:FALSE; }
// OnCPlGetCount
//
// Returns the number of CPl dialogs implemented by this DLL.
LONG OnCPlGetCount() { return 1; }
// OnCPlInquire
//
// Fills out a CPLINFO structure with information about the CPl dialog.
// This information includes the name, icon, and description.
LONG OnCPlInquire( int i, CPLINFO * pci ) { pci->idIcon = IDI_TELEPHONE; pci->idName = IDS_NAME; pci->idInfo = IDS_DESCRIPTION; pci->lData = 0; return 0; }
// OnCPlDblClk
//
// This message is sent whenever our CPl is selected. In response we display
// our UI and handle input. This is also used when we are started with parameters
// in which case we get passed a command line.
LONG OnCPlDblClk( int i, HWND hwndCPl, LPTSTR pszCmdLine ) { int iTab = 0;
if ( pszCmdLine ) { iTab = *pszCmdLine - TEXT('0'); if ( (iTab < 0) || (iTab > 2) ) { iTab = 0; } }
DisplayDialingRulesPropertyPage(hwndCPl, iTab);
return TRUE; }
// OnCPlStop
//
// Any resource allocated on a per-dialog basis in OnCPlInquire should be
// freed in this function. The lData member of the CPLINFO structure that
// was initialized in OnCPlInit is passed to this function.
LONG OnCPlStop( int i, LPARAM lData ) { return 0; }
// OnCPlExit
//
// This is the final message we recieve. Any memory that was allocated in
// OnCPlInit should be freed here. Release any resources we are holding.
LONG OnCPlExit() { return 0; }
typedef LONG (WINAPI *CONFIGPROC)(HWND, PWSTR, INT, DWORD);
void DisplayDialingRulesPropertyPage(HWND hwndCPl, int iTab) { // Load tapi32 and call InternalConfig of something like that
HINSTANCE hTapi = LoadLibrary(TEXT("TAPI32.DLL")); if ( hTapi ) { CONFIGPROC pfnInternalConfig = (CONFIGPROC)GetProcAddress(hTapi, "internalConfig"); if ( pfnInternalConfig ) { pfnInternalConfig( hwndCPl, NULL, iTab, TAPI_CURRENT_VERSION ); return; } }
// TODO: Show some sort of error dialog? Maybe something that says "your
// tapi32.dll is missing or corrupt, please reinstall."
}
|