196 lines
4 KiB
C++
196 lines
4 KiB
C++
// 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."
|
|
}
|