├── MyCPLApplet ├── icon1.ico ├── Resource.h ├── MyCPLApplet.rc ├── res │ └── MyCPLApplet.rc2 ├── MyCPLApplet.def ├── stdafx.cpp ├── targetver.h ├── MyThirdPropPage.h ├── MyCPLApplet.h ├── MyPropertySheet.h ├── MyThirdPropPage.cpp ├── MySecondPropPage.h ├── MyPropertySheet.cpp ├── MyFirstPropPage.h ├── stdafx.h ├── MyCPLApplet.vcxproj.user ├── MySecondPropPage.cpp ├── ReadMe.txt ├── MyCPLApplet.vcxproj.filters ├── MyCPLApplet.cpp ├── MyFirstPropPage.cpp └── MyCPLApplet.vcxproj ├── MyCPLApplet.sln ├── README.md ├── .gitattributes └── .gitignore /MyCPLApplet/icon1.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gtrubach/MyCPLApplet/HEAD/MyCPLApplet/icon1.ico -------------------------------------------------------------------------------- /MyCPLApplet/Resource.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gtrubach/MyCPLApplet/HEAD/MyCPLApplet/Resource.h -------------------------------------------------------------------------------- /MyCPLApplet/MyCPLApplet.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gtrubach/MyCPLApplet/HEAD/MyCPLApplet/MyCPLApplet.rc -------------------------------------------------------------------------------- /MyCPLApplet/res/MyCPLApplet.rc2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gtrubach/MyCPLApplet/HEAD/MyCPLApplet/res/MyCPLApplet.rc2 -------------------------------------------------------------------------------- /MyCPLApplet/MyCPLApplet.def: -------------------------------------------------------------------------------- 1 | ; MyCPLApplet.def : Declares the module parameters for the DLL. 2 | 3 | LIBRARY 4 | 5 | EXPORTS 6 | ; Explicit exports can go here 7 | CPlApplet 8 | -------------------------------------------------------------------------------- /MyCPLApplet/stdafx.cpp: -------------------------------------------------------------------------------- 1 | // stdafx.cpp : source file that includes just the standard includes 2 | // MyCPLApplet.pch will be the pre-compiled header 3 | // stdafx.obj will contain the pre-compiled type information 4 | 5 | #include "stdafx.h" 6 | 7 | 8 | -------------------------------------------------------------------------------- /MyCPLApplet/targetver.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | // Including SDKDDKVer.h defines the highest available Windows platform. 4 | 5 | // If you wish to build your application for a previous Windows platform, include WinSDKVer.h and 6 | // set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /MyCPLApplet/MyThirdPropPage.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | 4 | // CMyThirdPropPage dialog 5 | 6 | class CMyThirdPropPage : public CPropertyPage 7 | { 8 | DECLARE_DYNAMIC(CMyThirdPropPage) 9 | 10 | public: 11 | CMyThirdPropPage(); 12 | virtual ~CMyThirdPropPage(); 13 | 14 | // Dialog Data 15 | #ifdef AFX_DESIGN_TIME 16 | enum { IDD = IDD_MYTHIRDPROPPAGE }; 17 | #endif 18 | 19 | protected: 20 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 21 | 22 | DECLARE_MESSAGE_MAP() 23 | }; 24 | -------------------------------------------------------------------------------- /MyCPLApplet/MyCPLApplet.h: -------------------------------------------------------------------------------- 1 | // MyCPLApplet.h : main header file for the MyCPLApplet DLL 2 | // 3 | 4 | #pragma once 5 | 6 | #ifndef __AFXWIN_H__ 7 | #error "include 'stdafx.h' before including this file for PCH" 8 | #endif 9 | 10 | #include "resource.h" // main symbols 11 | 12 | 13 | // CMyCPLAppletApp 14 | // See MyCPLApplet.cpp for the implementation of this class 15 | // 16 | 17 | class CMyCPLAppletApp : public CWinApp 18 | { 19 | public: 20 | CMyCPLAppletApp(); 21 | 22 | // Overrides 23 | public: 24 | virtual BOOL InitInstance(); 25 | 26 | DECLARE_MESSAGE_MAP() 27 | }; 28 | -------------------------------------------------------------------------------- /MyCPLApplet/MyPropertySheet.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "MyFirstPropPage.h" 3 | #include "MySecondPropPage.h" 4 | #include "MyThirdPropPage.h" 5 | 6 | 7 | // CMyPropertySheet 8 | 9 | class CMyPropertySheet : public CPropertySheet 10 | { 11 | DECLARE_DYNAMIC(CMyPropertySheet) 12 | private: 13 | CMyFirstPropPage m_ppFirst; 14 | CMySecondPropPage m_ppSecond; 15 | CMyThirdPropPage m_ppThird; 16 | public: 17 | CMyPropertySheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0); 18 | //CMyPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0); 19 | virtual ~CMyPropertySheet(); 20 | 21 | protected: 22 | DECLARE_MESSAGE_MAP() 23 | }; 24 | 25 | 26 | -------------------------------------------------------------------------------- /MyCPLApplet/MyThirdPropPage.cpp: -------------------------------------------------------------------------------- 1 | // MyThirdPropPage.cpp : implementation file 2 | // 3 | 4 | #include "stdafx.h" 5 | #include "MyCPLApplet.h" 6 | #include "MyThirdPropPage.h" 7 | #include "afxdialogex.h" 8 | 9 | 10 | // CMyThirdPropPage dialog 11 | 12 | IMPLEMENT_DYNAMIC(CMyThirdPropPage, CPropertyPage) 13 | 14 | CMyThirdPropPage::CMyThirdPropPage() 15 | : CPropertyPage(IDD_MYTHIRDPROPPAGE) 16 | { 17 | 18 | } 19 | 20 | CMyThirdPropPage::~CMyThirdPropPage() 21 | { 22 | } 23 | 24 | void CMyThirdPropPage::DoDataExchange(CDataExchange* pDX) 25 | { 26 | CPropertyPage::DoDataExchange(pDX); 27 | } 28 | 29 | 30 | BEGIN_MESSAGE_MAP(CMyThirdPropPage, CPropertyPage) 31 | END_MESSAGE_MAP() 32 | 33 | 34 | // CMyThirdPropPage message handlers 35 | -------------------------------------------------------------------------------- /MyCPLApplet/MySecondPropPage.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | 4 | // CMySecondPropPage dialog 5 | 6 | class CMySecondPropPage : public CPropertyPage 7 | { 8 | DECLARE_DYNAMIC(CMySecondPropPage) 9 | 10 | public: 11 | CMySecondPropPage(); 12 | virtual ~CMySecondPropPage(); 13 | 14 | // Dialog Data 15 | #ifdef AFX_DESIGN_TIME 16 | enum { IDD = IDD_MYSECONDPROPPAGE }; 17 | #endif 18 | 19 | protected: 20 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 21 | 22 | DECLARE_MESSAGE_MAP() 23 | public: 24 | virtual BOOL OnApply(); 25 | afx_msg void OnEnChangeEditServerName(); 26 | afx_msg void OnIpnFieldchangedIpAddressServer(NMHDR *pNMHDR, LRESULT *pResult); 27 | afx_msg void OnBnClickedCheckSsl(); 28 | afx_msg void OnBnClickedCheckShow(); 29 | }; 30 | -------------------------------------------------------------------------------- /MyCPLApplet/MyPropertySheet.cpp: -------------------------------------------------------------------------------- 1 | // MyPropertySheet.cpp : implementation file 2 | // 3 | 4 | #include "stdafx.h" 5 | #include "MyCPLApplet.h" 6 | #include "MyPropertySheet.h" 7 | 8 | 9 | // CMyPropertySheet 10 | 11 | IMPLEMENT_DYNAMIC(CMyPropertySheet, CPropertySheet) 12 | 13 | CMyPropertySheet::CMyPropertySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage) 14 | :CPropertySheet(nIDCaption, pParentWnd, iSelectPage) 15 | { 16 | AddPage(&m_ppFirst); 17 | AddPage(&m_ppSecond); 18 | AddPage(&m_ppThird); 19 | } 20 | 21 | //CMyPropertySheet::CMyPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) 22 | // :CPropertySheet(pszCaption, pParentWnd, iSelectPage) 23 | //{ 24 | // 25 | //} 26 | 27 | CMyPropertySheet::~CMyPropertySheet() 28 | { 29 | } 30 | 31 | 32 | BEGIN_MESSAGE_MAP(CMyPropertySheet, CPropertySheet) 33 | END_MESSAGE_MAP() 34 | 35 | 36 | // CMyPropertySheet message handlers 37 | -------------------------------------------------------------------------------- /MyCPLApplet/MyFirstPropPage.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "afxwin.h" 3 | #include "afxdtctl.h" 4 | #include "ATLComTime.h" 5 | 6 | 7 | // CMyFirstPropPage dialog 8 | 9 | class CMyFirstPropPage : public CPropertyPage 10 | { 11 | DECLARE_DYNAMIC(CMyFirstPropPage) 12 | 13 | public: 14 | CMyFirstPropPage(); 15 | virtual ~CMyFirstPropPage(); 16 | 17 | // Dialog Data 18 | #ifdef AFX_DESIGN_TIME 19 | enum { IDD = IDD_MYFIRSTPROPPAGE }; 20 | #endif 21 | 22 | protected: 23 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 24 | 25 | DECLARE_MESSAGE_MAP() 26 | public: 27 | virtual BOOL OnApply(); 28 | afx_msg void OnEnChangeEditName(UINT id); 29 | afx_msg void OnEnChangeEditEmail(); 30 | afx_msg void OnBnClickedRadioSex(UINT id); 31 | afx_msg void OnBnClickedCheck(UINT id); 32 | afx_msg void OnDtnDatetimechangeDatetimepickerBirthday(NMHDR *pNMHDR, LRESULT *pResult); 33 | protected: 34 | CString m_strFirstName; 35 | CString m_strLastName; 36 | COleDateTime m_odBirth; 37 | CString m_strEmail; 38 | BOOL m_bSex; 39 | 40 | BOOL SaveToReg(); 41 | void ReadFromReg(); 42 | }; 43 | -------------------------------------------------------------------------------- /MyCPLApplet.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.25123.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MyCPLApplet", "MyCPLApplet\MyCPLApplet.vcxproj", "{B318AE92-1125-4C51-B301-D4113D322114}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Debug|x86 = Debug|x86 12 | Release|x64 = Release|x64 13 | Release|x86 = Release|x86 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {B318AE92-1125-4C51-B301-D4113D322114}.Debug|x64.ActiveCfg = Debug|x64 17 | {B318AE92-1125-4C51-B301-D4113D322114}.Debug|x64.Build.0 = Debug|x64 18 | {B318AE92-1125-4C51-B301-D4113D322114}.Debug|x86.ActiveCfg = Debug|Win32 19 | {B318AE92-1125-4C51-B301-D4113D322114}.Debug|x86.Build.0 = Debug|Win32 20 | {B318AE92-1125-4C51-B301-D4113D322114}.Release|x64.ActiveCfg = Release|x64 21 | {B318AE92-1125-4C51-B301-D4113D322114}.Release|x64.Build.0 = Release|x64 22 | {B318AE92-1125-4C51-B301-D4113D322114}.Release|x86.ActiveCfg = Release|Win32 23 | {B318AE92-1125-4C51-B301-D4113D322114}.Release|x86.Build.0 = Release|Win32 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | EndGlobal 29 | -------------------------------------------------------------------------------- /MyCPLApplet/stdafx.h: -------------------------------------------------------------------------------- 1 | // stdafx.h : include file for standard system include files, 2 | // or project specific include files that are used frequently, but 3 | // are changed infrequently 4 | 5 | #pragma once 6 | 7 | #ifndef VC_EXTRALEAN 8 | #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers 9 | #endif 10 | 11 | #include "targetver.h" 12 | 13 | #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit 14 | 15 | #include // MFC core and standard components 16 | #include // MFC extensions 17 | 18 | #ifndef _AFX_NO_OLE_SUPPORT 19 | #include // MFC OLE classes 20 | #include // MFC OLE dialog classes 21 | #include // MFC Automation classes 22 | #endif // _AFX_NO_OLE_SUPPORT 23 | 24 | #ifndef _AFX_NO_DB_SUPPORT 25 | #include // MFC ODBC database classes 26 | #endif // _AFX_NO_DB_SUPPORT 27 | 28 | #ifndef _AFX_NO_DAO_SUPPORT 29 | #include // MFC DAO database classes 30 | #endif // _AFX_NO_DAO_SUPPORT 31 | 32 | #ifndef _AFX_NO_OLE_SUPPORT 33 | #include // MFC support for Internet Explorer 4 Common Controls 34 | #endif 35 | #ifndef _AFX_NO_AFXCMN_SUPPORT 36 | #include // MFC support for Windows Common Controls 37 | #endif // _AFX_NO_AFXCMN_SUPPORT 38 | 39 | #include 40 | -------------------------------------------------------------------------------- /MyCPLApplet/MyCPLApplet.vcxproj.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | C:\Windows\System32\Rundll32.exe 5 | shell32.dll, Control_RunDLL "$(TargetPath)" 6 | WindowsLocalDebugger 7 | 8 | 9 | C:\Windows\System32\Rundll32.exe 10 | shell32.dll, Control_RunDLL "$(TargetPath)" 11 | WindowsLocalDebugger 12 | 13 | 14 | C:\Windows\SysWOW64\Rundll32.exe 15 | shell32.dll, Control_RunDLL "$(TargetPath)" 16 | WindowsLocalDebugger 17 | 18 | 19 | C:\Windows\SysWOW64\Rundll32.exe 20 | shell32.dll, Control_RunDLL "$(TargetPath)" 21 | WindowsLocalDebugger 22 | 23 | -------------------------------------------------------------------------------- /MyCPLApplet/MySecondPropPage.cpp: -------------------------------------------------------------------------------- 1 | // MySecondPropPage.cpp : implementation file 2 | // 3 | 4 | #include "stdafx.h" 5 | #include "MyCPLApplet.h" 6 | #include "MySecondPropPage.h" 7 | #include "afxdialogex.h" 8 | 9 | 10 | // CMySecondPropPage dialog 11 | 12 | IMPLEMENT_DYNAMIC(CMySecondPropPage, CPropertyPage) 13 | 14 | CMySecondPropPage::CMySecondPropPage() 15 | : CPropertyPage(IDD_MYSECONDPROPPAGE) 16 | { 17 | 18 | } 19 | 20 | CMySecondPropPage::~CMySecondPropPage() 21 | { 22 | } 23 | 24 | void CMySecondPropPage::DoDataExchange(CDataExchange* pDX) 25 | { 26 | CPropertyPage::DoDataExchange(pDX); 27 | } 28 | 29 | 30 | BEGIN_MESSAGE_MAP(CMySecondPropPage, CPropertyPage) 31 | ON_EN_CHANGE(IDC_EDIT_SERVERNAME, &CMySecondPropPage::OnEnChangeEditServerName) 32 | ON_NOTIFY(IPN_FIELDCHANGED, IDC_IPADDRESS_SERVER, &CMySecondPropPage::OnIpnFieldchangedIpAddressServer) 33 | ON_BN_CLICKED(IDC_CHECK_SHOW, &CMySecondPropPage::OnBnClickedCheckShow) 34 | ON_BN_CLICKED(IDC_CHECK_SSL, &CMySecondPropPage::OnBnClickedCheckSsl) 35 | END_MESSAGE_MAP() 36 | 37 | 38 | // CMySecondPropPage message handlers 39 | 40 | 41 | BOOL CMySecondPropPage::OnApply() 42 | { 43 | // TODO: Add your specialized code here and/or call the base class 44 | 45 | return CPropertyPage::OnApply(); 46 | } 47 | 48 | 49 | void CMySecondPropPage::OnEnChangeEditServerName() 50 | { 51 | // TODO: If this is a RICHEDIT control, the control will not 52 | // send this notification unless you override the CPropertyPage::OnInitDialog() 53 | // function and call CRichEditCtrl().SetEventMask() 54 | // with the ENM_CHANGE flag ORed into the mask. 55 | 56 | // TODO: Add your control notification handler code here 57 | SetModified(TRUE); 58 | } 59 | 60 | 61 | void CMySecondPropPage::OnIpnFieldchangedIpAddressServer(NMHDR *pNMHDR, LRESULT *pResult) 62 | { 63 | LPNMIPADDRESS pIPAddr = reinterpret_cast(pNMHDR); 64 | // TODO: Add your control notification handler code here 65 | *pResult = 0; 66 | 67 | SetModified(TRUE); 68 | } 69 | 70 | 71 | void CMySecondPropPage::OnBnClickedCheckSsl() 72 | { 73 | // TODO: Add your control notification handler code here 74 | SetModified(TRUE); 75 | } 76 | 77 | 78 | void CMySecondPropPage::OnBnClickedCheckShow() 79 | { 80 | // TODO: Add your control notification handler code here 81 | } 82 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MyCPLApplet 2 | 3 | ## Description 4 | There is an example of creating control panel applets in Windows. 5 | 6 | ## Requiremets 7 | * [Visual Studio 2015 IDE](https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx) 8 | 9 | ## How to get it 10 | 1. Download/Clone this repository. 11 | 2. Open solution file `.sln`. 12 | 3. Build the solution. 13 | 14 | ### Remarks 15 | This sample writes in registry under `HKEY_LOCAL_MACHINE`. So you need to run this application with administator rights. 16 | 17 | ## How to create your own CPL applet 18 | 1. Open [Visual Studio 2015 IDE](https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx). 19 | 2. Start project wizard 20 | 21 | File->New->Project 22 | 3. Select Visual C++ MFC Dll 23 | 24 | Visual C++->MFC->MFC DLL 25 | 4. Press `OK` and `Finish`. 26 | 5. Add extern applet function that initialize and handling your applet. For example see function `CplApplet` [here](https://github.com/gtrubach/MyCPLApplet/blob/master/MyCPLApplet/MyCPLApplet.cpp). 27 | 6. Define your applet function in definition file `.def`. 28 | 29 | ## How to debug CPL applets in Visual Studio IDE 30 | 1. Open project properties. 31 | 2. In `General` tab change `Target Extension` to `.cpl`. 32 | 3. In `Debugging` tab add 33 | 34 | Command : \Rundll32.exe 35 | Command Arguments : shell32.dll, Control_RunDLL "$(TargetPath)" 36 | 4. Press `Ok`. 37 | 38 | ### Remarks 39 | Here you can see examples of `Command` 40 | 41 | x86 configuration : C:\Windows\SysWOW64\Rundll32.exe 42 | x64 configuration : C:\Windows\System32\Rundll32.exe 43 | 44 | ## Access violation when you call the CPropertySheet::DoModal method 45 | This exception is thrown because the CommCtl32.dll tries to modify the resources for the pages. 46 | 47 | To avoid it you should change the font of the pages so they are not `MS Sans Serif`. MFC checks the dialog template font for the page. If it is not MS Sans Serif, MFC makes a copy of the resource in read/write memory, and then modifies the font and passes this to the C mCtl32.dll. When the DLL writes to the template for the page, it is writing to read/write memory. Therfore, an exception is not thrown. 48 | 49 | Also you can read full article about this on [msdn](https://support.microsoft.com/en-us/kb/158552). -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /MyCPLApplet/ReadMe.txt: -------------------------------------------------------------------------------- 1 | ======================================================================== 2 | MICROSOFT FOUNDATION CLASS LIBRARY : MyCPLApplet Project Overview 3 | ======================================================================== 4 | 5 | 6 | AppWizard has created this MyCPLApplet DLL for you. This DLL not only 7 | demonstrates the basics of using the Microsoft Foundation classes but 8 | is also a starting point for writing your DLL. 9 | 10 | This file contains a summary of what you will find in each of the files that 11 | make up your MyCPLApplet DLL. 12 | 13 | MyCPLApplet.vcxproj 14 | This is the main project file for VC++ projects generated using an Application Wizard. 15 | It contains information about the version of Visual C++ that generated the file, and 16 | information about the platforms, configurations, and project features selected with the 17 | Application Wizard. 18 | 19 | MyCPLApplet.vcxproj.filters 20 | This is the filters file for VC++ projects generated using an Application Wizard. 21 | It contains information about the association between the files in your project 22 | and the filters. This association is used in the IDE to show grouping of files with 23 | similar extensions under a specific node (for e.g. ".cpp" files are associated with the 24 | "Source Files" filter). 25 | 26 | MyCPLApplet.h 27 | This is the main header file for the DLL. It declares the 28 | CMyCPLAppletApp class. 29 | 30 | MyCPLApplet.cpp 31 | This is the main DLL source file. It contains the class CMyCPLAppletApp. 32 | 33 | MyCPLApplet.rc 34 | This is a listing of all of the Microsoft Windows resources that the 35 | program uses. It includes the icons, bitmaps, and cursors that are stored 36 | in the RES subdirectory. This file can be directly edited in Microsoft 37 | Visual C++. 38 | 39 | res\MyCPLApplet.rc2 40 | This file contains resources that are not edited by Microsoft 41 | Visual C++. You should place all resources not editable by 42 | the resource editor in this file. 43 | 44 | MyCPLApplet.def 45 | This file contains information about the DLL that must be 46 | provided to run with Microsoft Windows. It defines parameters 47 | such as the name and description of the DLL. It also exports 48 | functions from the DLL. 49 | 50 | ///////////////////////////////////////////////////////////////////////////// 51 | Other standard files: 52 | 53 | StdAfx.h, StdAfx.cpp 54 | These files are used to build a precompiled header (PCH) file 55 | named MyCPLApplet.pch and a precompiled types file named StdAfx.obj. 56 | 57 | Resource.h 58 | This is the standard header file, which defines new resource IDs. 59 | Microsoft Visual C++ reads and updates this file. 60 | 61 | ///////////////////////////////////////////////////////////////////////////// 62 | Other notes: 63 | 64 | AppWizard uses "TODO:" to indicate parts of the source code you 65 | should add to or customize. 66 | 67 | ///////////////////////////////////////////////////////////////////////////// 68 | -------------------------------------------------------------------------------- /MyCPLApplet/MyCPLApplet.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | Source Files 23 | 24 | 25 | Source Files 26 | 27 | 28 | Source Files 29 | 30 | 31 | Source Files 32 | 33 | 34 | Source Files 35 | 36 | 37 | Source Files 38 | 39 | 40 | 41 | 42 | Header Files 43 | 44 | 45 | Header Files 46 | 47 | 48 | Header Files 49 | 50 | 51 | Header Files 52 | 53 | 54 | Header Files 55 | 56 | 57 | Header Files 58 | 59 | 60 | Header Files 61 | 62 | 63 | Header Files 64 | 65 | 66 | 67 | 68 | Source Files 69 | 70 | 71 | Resource Files 72 | 73 | 74 | 75 | 76 | Resource Files 77 | 78 | 79 | 80 | 81 | Resource Files 82 | 83 | 84 | -------------------------------------------------------------------------------- /MyCPLApplet/MyCPLApplet.cpp: -------------------------------------------------------------------------------- 1 | // MyCPLApplet.cpp : Defines the initialization routines for the DLL. 2 | // 3 | 4 | #include "stdafx.h" 5 | #include "MyCPLApplet.h" 6 | 7 | #include "resource.h" 8 | #include "MyPropertySheet.h" 9 | 10 | #ifdef _DEBUG 11 | #define new DEBUG_NEW 12 | #endif 13 | 14 | // 15 | //TODO: If this DLL is dynamically linked against the MFC DLLs, 16 | // any functions exported from this DLL which call into 17 | // MFC must have the AFX_MANAGE_STATE macro added at the 18 | // very beginning of the function. 19 | // 20 | // For example: 21 | // 22 | // extern "C" BOOL PASCAL EXPORT ExportedFunction() 23 | // { 24 | // AFX_MANAGE_STATE(AfxGetStaticModuleState()); 25 | // // normal function body here 26 | // } 27 | // 28 | // It is very important that this macro appear in each 29 | // function, prior to any calls into MFC. This means that 30 | // it must appear as the first statement within the 31 | // function, even before any object variable declarations 32 | // as their constructors may generate calls into the MFC 33 | // DLL. 34 | // 35 | // Please see MFC Technical Notes 33 and 58 for additional 36 | // details. 37 | // 38 | 39 | // CMyCPLAppletApp 40 | 41 | BEGIN_MESSAGE_MAP(CMyCPLAppletApp, CWinApp) 42 | END_MESSAGE_MAP() 43 | 44 | 45 | // CMyCPLAppletApp construction 46 | 47 | CMyCPLAppletApp::CMyCPLAppletApp() 48 | { 49 | // TODO: add construction code here, 50 | // Place all significant initialization in InitInstance 51 | } 52 | 53 | 54 | // The one and only CMyCPLAppletApp object 55 | 56 | CMyCPLAppletApp theApp; 57 | 58 | 59 | // CMyCPLAppletApp initialization 60 | 61 | BOOL CMyCPLAppletApp::InitInstance() 62 | { 63 | CWinApp::InitInstance(); 64 | 65 | return TRUE; 66 | } 67 | 68 | extern "C" LONG APIENTRY CPlApplet( 69 | HWND hwndCPL, // handle of Control Panel window 70 | UINT uMsg, // message 71 | LONG_PTR lParam1, // first message parameter 72 | LONG_PTR lParam2 // second message parameter 73 | ) 74 | { 75 | AFX_MANAGE_STATE(AfxGetStaticModuleState()); 76 | 77 | LPCPLINFO lpCPlInfo; 78 | LONG retCode = 0; 79 | 80 | switch (uMsg) 81 | { 82 | case CPL_INIT: // first message, sent once 83 | return TRUE; 84 | 85 | case CPL_GETCOUNT: // second message, sent once 86 | return 1L; // (LONG)NUM_APPLETS; 87 | 88 | case CPL_INQUIRE: // third message, sent once per app 89 | lpCPlInfo = (LPCPLINFO)lParam2; 90 | 91 | lpCPlInfo->idIcon = IDI_SAMPLE_CPL; 92 | lpCPlInfo->idName = IDS_SAMPLE_CPL_NAME; 93 | lpCPlInfo->idInfo = IDS_SAMPLE_CPL_DESCRIPTION; 94 | lpCPlInfo->lData = 0L; 95 | break; 96 | 97 | case CPL_DBLCLK: // application icon double-clicked 98 | { 99 | CWnd wndCPL; 100 | BOOL b = wndCPL.Attach(hwndCPL); 101 | CMyPropertySheet propSheet(IDS_SAMPLE_CPL_NAME, &wndCPL); 102 | 103 | // This is where you would retrieve information from the property 104 | // sheet if propSheet.DoModal() returned IDOK. We aren't doing 105 | // anything for simplicity. 106 | 107 | propSheet.DoModal(); 108 | wndCPL.Detach(); 109 | } 110 | break; 111 | } 112 | return retCode; 113 | } 114 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | //*.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | [Xx]64/ 19 | [Xx]86/ 20 | [Bb]uild/ 21 | bld/ 22 | [Bb]in/ 23 | [Oo]bj/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | artifacts/ 46 | 47 | *_i.c 48 | *_p.c 49 | *_i.h 50 | *.ilk 51 | *.meta 52 | *.obj 53 | *.pch 54 | *.pdb 55 | *.pgc 56 | *.pgd 57 | *.rsp 58 | *.sbr 59 | *.tlb 60 | *.tli 61 | *.tlh 62 | *.tmp 63 | *.tmp_proj 64 | *.log 65 | *.vspscc 66 | *.vssscc 67 | .builds 68 | *.pidb 69 | *.svclog 70 | *.scc 71 | 72 | # Chutzpah Test files 73 | _Chutzpah* 74 | 75 | # Visual C++ cache files 76 | ipch/ 77 | *.aps 78 | *.ncb 79 | *.opendb 80 | *.opensdf 81 | *.sdf 82 | *.cachefile 83 | *.VC.db 84 | 85 | # Visual Studio profiler 86 | *.psess 87 | *.vsp 88 | *.vspx 89 | *.sap 90 | 91 | # TFS 2012 Local Workspace 92 | $tf/ 93 | 94 | # Guidance Automation Toolkit 95 | *.gpState 96 | 97 | # ReSharper is a .NET coding add-in 98 | _ReSharper*/ 99 | *.[Rr]e[Ss]harper 100 | *.DotSettings.user 101 | 102 | # JustCode is a .NET coding add-in 103 | .JustCode 104 | 105 | # TeamCity is a build add-in 106 | _TeamCity* 107 | 108 | # DotCover is a Code Coverage Tool 109 | *.dotCover 110 | 111 | # NCrunch 112 | _NCrunch_* 113 | .*crunch*.local.xml 114 | nCrunchTemp_* 115 | 116 | # MightyMoose 117 | *.mm.* 118 | AutoTest.Net/ 119 | 120 | # Web workbench (sass) 121 | .sass-cache/ 122 | 123 | # Installshield output folder 124 | [Ee]xpress/ 125 | 126 | # DocProject is a documentation generator add-in 127 | DocProject/buildhelp/ 128 | DocProject/Help/*.HxT 129 | DocProject/Help/*.HxC 130 | DocProject/Help/*.hhc 131 | DocProject/Help/*.hhk 132 | DocProject/Help/*.hhp 133 | DocProject/Help/Html2 134 | DocProject/Help/html 135 | 136 | # Click-Once directory 137 | publish/ 138 | 139 | # Publish Web Output 140 | *.[Pp]ublish.xml 141 | *.azurePubxml 142 | 143 | # TODO: Un-comment the next line if you do not want to checkin 144 | # your web deploy settings because they may include unencrypted 145 | # passwords 146 | #*.pubxml 147 | *.publishproj 148 | 149 | # NuGet Packages 150 | *.nupkg 151 | # The packages folder can be ignored because of Package Restore 152 | **/packages/* 153 | # except build/, which is used as an MSBuild target. 154 | !**/packages/build/ 155 | # Uncomment if necessary however generally it will be regenerated when needed 156 | #!**/packages/repositories.config 157 | # NuGet v3's project.json files produces more ignoreable files 158 | *.nuget.props 159 | *.nuget.targets 160 | 161 | # Microsoft Azure Build Output 162 | csx/ 163 | *.build.csdef 164 | 165 | # Microsoft Azure Emulator 166 | ecf/ 167 | rcf/ 168 | 169 | # Microsoft Azure ApplicationInsights config file 170 | ApplicationInsights.config 171 | 172 | # Windows Store app package directory 173 | AppPackages/ 174 | BundleArtifacts/ 175 | 176 | # Visual Studio cache files 177 | # files ending in .cache can be ignored 178 | *.[Cc]ache 179 | # but keep track of directories ending in .cache 180 | !*.[Cc]ache/ 181 | 182 | # Others 183 | ClientBin/ 184 | [Ss]tyle[Cc]op.* 185 | ~$* 186 | *~ 187 | *.dbmdl 188 | *.dbproj.schemaview 189 | *.pfx 190 | *.publishsettings 191 | node_modules/ 192 | orleans.codegen.cs 193 | 194 | # RIA/Silverlight projects 195 | Generated_Code/ 196 | 197 | # Backup & report files from converting an old project file 198 | # to a newer Visual Studio version. Backup files are not needed, 199 | # because we have git ;-) 200 | _UpgradeReport_Files/ 201 | Backup*/ 202 | UpgradeLog*.XML 203 | UpgradeLog*.htm 204 | 205 | # SQL Server files 206 | *.mdf 207 | *.ldf 208 | 209 | # Business Intelligence projects 210 | *.rdl.data 211 | *.bim.layout 212 | *.bim_*.settings 213 | 214 | # Microsoft Fakes 215 | FakesAssemblies/ 216 | 217 | # GhostDoc plugin setting file 218 | *.GhostDoc.xml 219 | 220 | # Node.js Tools for Visual Studio 221 | .ntvs_analysis.dat 222 | 223 | # Visual Studio 6 build log 224 | *.plg 225 | 226 | # Visual Studio 6 workspace options file 227 | *.opt 228 | 229 | # Visual Studio LightSwitch build output 230 | **/*.HTMLClient/GeneratedArtifacts 231 | **/*.DesktopClient/GeneratedArtifacts 232 | **/*.DesktopClient/ModelManifest.xml 233 | **/*.Server/GeneratedArtifacts 234 | **/*.Server/ModelManifest.xml 235 | _Pvt_Extensions 236 | 237 | # LightSwitch generated files 238 | GeneratedArtifacts/ 239 | ModelManifest.xml 240 | 241 | # Paket dependency manager 242 | .paket/paket.exe 243 | 244 | # FAKE - F# Make 245 | .fake/ -------------------------------------------------------------------------------- /MyCPLApplet/MyFirstPropPage.cpp: -------------------------------------------------------------------------------- 1 | // MyFirstPropPage.cpp : implementation file 2 | // 3 | 4 | #include "stdafx.h" 5 | #include "MyCPLApplet.h" 6 | #include "MyFirstPropPage.h" 7 | #include "afxdialogex.h" 8 | 9 | 10 | // CMyFirstPropPage dialog 11 | 12 | IMPLEMENT_DYNAMIC(CMyFirstPropPage, CPropertyPage) 13 | 14 | CMyFirstPropPage::CMyFirstPropPage() 15 | : CPropertyPage(IDD_MYFIRSTPROPPAGE) 16 | , m_strEmail(_T("")) 17 | , m_strFirstName(_T("")) 18 | , m_strLastName(_T("")) 19 | , m_odBirth(COleDateTime::GetCurrentTime()) 20 | , m_bSex(FALSE) 21 | { 22 | ReadFromReg(); 23 | } 24 | 25 | CMyFirstPropPage::~CMyFirstPropPage() 26 | { 27 | } 28 | 29 | void CMyFirstPropPage::DoDataExchange(CDataExchange* pDX) 30 | { 31 | CPropertyPage::DoDataExchange(pDX); 32 | DDX_Text(pDX, IDC_EDIT_EMAIL, m_strEmail); 33 | DDV_MaxChars(pDX, m_strEmail, 255); 34 | DDX_Text(pDX, IDC_EDIT_FIRSTNAME, m_strFirstName); 35 | DDV_MaxChars(pDX, m_strFirstName, 255); 36 | DDX_Text(pDX, IDC_EDIT_LASTNAME, m_strLastName); 37 | DDV_MaxChars(pDX, m_strLastName, 255); 38 | DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER_BIRTHDAY, m_odBirth); 39 | DDX_Radio(pDX, IDC_RADIO_SEX_MALE, m_bSex); 40 | } 41 | 42 | 43 | BEGIN_MESSAGE_MAP(CMyFirstPropPage, CPropertyPage) 44 | ON_CONTROL_RANGE(EN_CHANGE, IDC_EDIT_FIRSTNAME, IDC_EDIT_LASTNAME, &CMyFirstPropPage::OnEnChangeEditName) 45 | ON_EN_CHANGE(IDC_EDIT_EMAIL, &CMyFirstPropPage::OnEnChangeEditEmail) 46 | ON_CONTROL_RANGE(BN_CLICKED, IDC_RADIO_SEX_MALE, IDC_RADIO_SEX_FEMALE, &CMyFirstPropPage::OnBnClickedRadioSex) 47 | ON_CONTROL_RANGE(BN_CLICKED, IDC_CHECK_C, IDC_CHECK_GO,&CMyFirstPropPage::OnBnClickedCheck) 48 | ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATETIMEPICKER_BIRTHDAY, &CMyFirstPropPage::OnDtnDatetimechangeDatetimepickerBirthday) 49 | END_MESSAGE_MAP() 50 | 51 | 52 | // CMyFirstPropPage message handlers 53 | 54 | 55 | BOOL CMyFirstPropPage::OnApply() 56 | { 57 | // TODO: Add your specialized code here and/or call the base class 58 | //MessageBox(NULL, _T("Got it"), MB_OK); 59 | 60 | if (!SaveToReg()) return FALSE; 61 | 62 | return CPropertyPage::OnApply(); 63 | } 64 | 65 | 66 | void CMyFirstPropPage::OnEnChangeEditName(UINT id) 67 | { 68 | // TODO: If this is a RICHEDIT control, the control will not 69 | // send this notification unless you override the CPropertyPage::OnInitDialog() 70 | // function and call CRichEditCtrl().SetEventMask() 71 | // with the ENM_CHANGE flag ORed into the mask. 72 | 73 | // TODO: Add your control notification handler code here 74 | SetModified(TRUE); 75 | } 76 | 77 | 78 | void CMyFirstPropPage::OnEnChangeEditEmail() 79 | { 80 | // TODO: If this is a RICHEDIT control, the control will not 81 | // send this notification unless you override the CPropertyPage::OnInitDialog() 82 | // function and call CRichEditCtrl().SetEventMask() 83 | // with the ENM_CHANGE flag ORed into the mask. 84 | 85 | // TODO: Add your control notification handler code here 86 | SetModified(TRUE); 87 | } 88 | 89 | 90 | void CMyFirstPropPage::OnBnClickedCheck(UINT id) 91 | { 92 | // TODO: Add your control notification handler code here 93 | SetModified(TRUE); 94 | } 95 | 96 | 97 | void CMyFirstPropPage::OnBnClickedRadioSex(UINT id) 98 | { 99 | // TODO: Add your control notification handler code here 100 | SetModified(TRUE); 101 | } 102 | 103 | 104 | void CMyFirstPropPage::OnDtnDatetimechangeDatetimepickerBirthday(NMHDR *pNMHDR, LRESULT *pResult) 105 | { 106 | LPNMDATETIMECHANGE pDTChange = reinterpret_cast(pNMHDR); 107 | // TODO: Add your control notification handler code here 108 | *pResult = 0; 109 | SetModified(TRUE); 110 | } 111 | 112 | BOOL CMyFirstPropPage::SaveToReg() 113 | { 114 | SECURITY_ATTRIBUTES sa; 115 | ZeroMemory(&sa, sizeof(sa)); 116 | DWORD disposition; 117 | HKEY hKey; 118 | if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\MyCPLApplet\\MyCPLApplet"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, &sa, &hKey, &disposition) == ERROR_SUCCESS) 119 | { 120 | if (RegSetValueEx(hKey, _T("First Name"), 0, REG_SZ, (LPBYTE)(LPCTSTR)m_strFirstName, (m_strFirstName.GetLength() + 1) * sizeof(TCHAR)) != ERROR_SUCCESS || 121 | RegSetValueEx(hKey, _T("Last Name"), 0, REG_SZ, (LPBYTE)(LPCTSTR)m_strLastName, (m_strLastName.GetLength() + 1) * sizeof(TCHAR)) != ERROR_SUCCESS || 122 | RegSetValueEx(hKey, _T("Birthday"), 0, REG_BINARY, (LPBYTE)&m_odBirth.m_dt, sizeof(double)) != ERROR_SUCCESS || 123 | RegSetValueEx(hKey, _T("Sex"), 0, REG_DWORD, (LPBYTE)&m_bSex, sizeof(BOOL)) != ERROR_SUCCESS || 124 | RegSetValueEx(hKey, _T("Email"), 0, REG_SZ, (LPBYTE)(LPCTSTR)m_strEmail, (m_strEmail.GetLength() + 1) * sizeof(TCHAR)) != ERROR_SUCCESS) 125 | { 126 | return FALSE; 127 | } 128 | 129 | RegCloseKey(hKey); 130 | return TRUE; 131 | } 132 | return FALSE; 133 | } 134 | 135 | void CMyFirstPropPage::ReadFromReg() 136 | { 137 | SECURITY_ATTRIBUTES sa; 138 | ZeroMemory(&sa, sizeof(sa)); 139 | DWORD disposition; 140 | HKEY hKey; 141 | if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\MyCPLApplet\\MyCPLApplet"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, &sa, &hKey, &disposition) == ERROR_SUCCESS) 142 | { 143 | if (disposition == REG_OPENED_EXISTING_KEY) 144 | { 145 | DWORD size = 0; 146 | 147 | RegQueryValueEx(hKey, _T("First Name"), 0, NULL, NULL, &size); 148 | RegQueryValueEx(hKey, _T("First Name"), 0, NULL, (LPBYTE)m_strFirstName.GetBuffer(size), &size); 149 | m_strFirstName.ReleaseBuffer(); 150 | 151 | RegQueryValueEx(hKey, _T("Last Name"), 0, NULL, NULL, &size); 152 | RegQueryValueEx(hKey, _T("Last Name"), 0, NULL, (LPBYTE)m_strLastName.GetBuffer(size), &size); 153 | m_strLastName.ReleaseBuffer(); 154 | 155 | RegQueryValueEx(hKey, _T("Birthday"), 0, NULL, NULL, &size); 156 | RegQueryValueEx(hKey, _T("Birthday"), 0, NULL, (LPBYTE)&m_odBirth.m_dt, &size); 157 | 158 | RegQueryValueEx(hKey, _T("Sex"), 0, NULL, NULL, &size); 159 | RegQueryValueEx(hKey, _T("Sex"), 0, NULL, (LPBYTE)&m_bSex, &size); 160 | 161 | RegQueryValueEx(hKey, _T("Email"), 0, NULL, NULL, &size); 162 | RegQueryValueEx(hKey, _T("Email"), 0, NULL, (LPBYTE)m_strEmail.GetBuffer(size), &size); 163 | m_strEmail.ReleaseBuffer(); 164 | } 165 | 166 | RegCloseKey(hKey); 167 | } 168 | } 169 | -------------------------------------------------------------------------------- /MyCPLApplet/MyCPLApplet.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | {B318AE92-1125-4C51-B301-D4113D322114} 23 | MyCPLApplet 24 | 8.1 25 | MFCDLLProj 26 | 27 | 28 | 29 | DynamicLibrary 30 | true 31 | v140 32 | Unicode 33 | Dynamic 34 | 35 | 36 | DynamicLibrary 37 | false 38 | v140 39 | true 40 | Unicode 41 | Dynamic 42 | 43 | 44 | DynamicLibrary 45 | true 46 | v140 47 | Unicode 48 | Dynamic 49 | 50 | 51 | DynamicLibrary 52 | false 53 | v140 54 | true 55 | Unicode 56 | Dynamic 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | true 78 | .cpl 79 | 80 | 81 | true 82 | .cpl 83 | 84 | 85 | false 86 | .cpl 87 | 88 | 89 | false 90 | .cpl 91 | 92 | 93 | 94 | Use 95 | Level3 96 | Disabled 97 | WIN32;_WINDOWS;_DEBUG;_USRDLL;%(PreprocessorDefinitions) 98 | true 99 | 100 | 101 | Windows 102 | .\MyCPLApplet.def 103 | 104 | 105 | false 106 | _DEBUG;%(PreprocessorDefinitions) 107 | 108 | 109 | 0x0409 110 | _DEBUG;%(PreprocessorDefinitions) 111 | $(IntDir);%(AdditionalIncludeDirectories) 112 | 113 | 114 | 115 | 116 | Use 117 | Level3 118 | Disabled 119 | _WINDOWS;_DEBUG;_USRDLL;%(PreprocessorDefinitions) 120 | true 121 | 122 | 123 | Windows 124 | .\MyCPLApplet.def 125 | 126 | 127 | false 128 | _DEBUG;%(PreprocessorDefinitions) 129 | 130 | 131 | 0x0409 132 | _DEBUG;%(PreprocessorDefinitions) 133 | $(IntDir);%(AdditionalIncludeDirectories) 134 | 135 | 136 | 137 | 138 | Level3 139 | Use 140 | MaxSpeed 141 | true 142 | true 143 | WIN32;_WINDOWS;NDEBUG;_USRDLL;%(PreprocessorDefinitions) 144 | true 145 | 146 | 147 | Windows 148 | true 149 | true 150 | .\MyCPLApplet.def 151 | 152 | 153 | false 154 | NDEBUG;%(PreprocessorDefinitions) 155 | 156 | 157 | 0x0409 158 | NDEBUG;%(PreprocessorDefinitions) 159 | $(IntDir);%(AdditionalIncludeDirectories) 160 | 161 | 162 | 163 | 164 | Level3 165 | Use 166 | MaxSpeed 167 | true 168 | true 169 | _WINDOWS;NDEBUG;_USRDLL;%(PreprocessorDefinitions) 170 | true 171 | 172 | 173 | Windows 174 | true 175 | true 176 | .\MyCPLApplet.def 177 | 178 | 179 | false 180 | NDEBUG;%(PreprocessorDefinitions) 181 | 182 | 183 | 0x0409 184 | NDEBUG;%(PreprocessorDefinitions) 185 | $(IntDir);%(AdditionalIncludeDirectories) 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | Create 199 | Create 200 | Create 201 | Create 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | --------------------------------------------------------------------------------