⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proppage.cpp

📁 Windows 2000/Xp虚拟串口(null modem cable)
💻 CPP
字号:
//
// ComEmulDrv property page
//
// Copyright (c) 2002 
// MixW team
// http://www.mixw.net
//

#include "stdafx.h"
#include "resource.h"
#include "PropPage.h"

#define MAXPORT 255
#define MAXPAIR 10
#define MIXREGKEY "SYSTEM\\CurrentControlSet\\Services\\MixWComEmul"

HINSTANCE       hInst;
/*
typedef struct {
    HKEY    drvConfigKey;
    BOOL    drvConfigKeyValid;
    HKEY    svcConfigKey;
    BOOL    svcConfigKeyValid;

    ULONG   timeoutScaling;
    ULONG   statusLines;
    ULONG   activeConnectOnly;

    ULONG   oldTimeoutScaling;
    ULONG   oldStatusLines;
    ULONG   oldActiveConnectOnly;


} PP_PARAMS_STRUCT;
*/
//char sNumber1[10] = "101", sNumber2[10] = "102";

int m_iCom1[MAXPAIR], m_iCom2[MAXPAIR];

BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason)
    {
        case DLL_PROCESS_ATTACH:
            hInst = hDll;
            DisableThreadLibraryCalls(hDll);

            break;

        case DLL_PROCESS_DETACH:
            break;

        default:
            break;
    }

    return TRUE;
}

BOOL CALLBACK PropDialogProc(HWND hwnd, UINT uMessage, WPARAM  wParam, LPARAM  lParam);
UINT CALLBACK PropPageCallback(HWND hwnd, UINT uMsg, LPPROPSHEETPAGE pPsp);


void ReadConfig(HWND hwnd)
{
    HKEY        Key;

//MessageBox(0,"rc1","",0);
    
	if (RegOpenKey(HKEY_LOCAL_MACHINE,
                   MIXREGKEY,
                   &Key) != ERROR_SUCCESS)
				   return;

	DWORD Len;

/*
    if (RegQueryValue(Key, "1", sNumber1, &Len) != ERROR_SUCCESS || Len<=0)
		strcpy(sNumber1,"201");

	Len = 10;
    if (RegQueryValue(Key, "2", sNumber2, &Len) != ERROR_SUCCESS || Len<=0)
		strcpy(sNumber2,"202");
*/

	char s[100],ss[20]="Pair";
	for (int i=0; i<MAXPAIR; i++)
	{
		itoa(i+1,ss+4,10);
		strcat(ss,"-Port1");

		Len = 9;
		if (RegQueryValueEx(Key, ss, 0,0, (BYTE*)s, &Len) != ERROR_SUCCESS)
			strcpy(s,"0");
		m_iCom1[i] = atoi(s);
		
		if (m_iCom1[i]<0 || m_iCom1[i]>MAXPORT)
			m_iCom1[i] = 0;

		itoa(i+1,ss+4,10);
		strcat(ss,"-Port2");

		Len = 9;
		if (RegQueryValueEx(Key, ss, 0,0, (BYTE*)s, &Len) != ERROR_SUCCESS)
			strcpy(s,"0");
		m_iCom2[i] = atoi(s);

		if (m_iCom2[i]<0 || m_iCom2[i]>MAXPORT)
			m_iCom2[i] = 0;
	}

	RegCloseKey(Key);

//MessageBox(0,"rc2","",0);

//	MessageBox(0,sNumber1,"",0);
//	MessageBox(0,sNumber2,"",0);
}

void WriteConfig(HWND hwnd)
{
    HKEY        Key;

//MessageBox(0,"rc1","",0);
    
	if (RegOpenKey(HKEY_LOCAL_MACHINE,
                   MIXREGKEY,
                   &Key) != ERROR_SUCCESS)
				   return;

	char s[100],ss[20]="Pair";
	for (int i=0; i<MAXPAIR; i++)
	{
		itoa(i+1,ss+4,10);
		strcat(ss,"-Port1");
		itoa(m_iCom1[i],s,10);

	    RegSetValueEx(Key, ss, NULL, REG_SZ,
		              (BYTE*)s, strlen(s));
	
		itoa(i+1,ss+4,10);
		strcat(ss,"-Port2");
		itoa(m_iCom2[i],s,10);

		RegSetValueEx(Key, ss, NULL, REG_SZ,
                      (BYTE*)s, strlen(s));

	}

	RegCloseKey(Key);
}

BOOL WINAPI MixPropPageProvider(LPVOID pInfo, LPFNADDPROPSHEETPAGE addProc,
                                                LPARAM lParam)
{
    PROPSHEETPAGE       psp;
    HPROPSHEETPAGE      hpsp;


//    PP_PARAMS_STRUCT*   pParams;


//    pParams = (PP_PARAMS_STRUCT*)LocalAlloc(LPTR, sizeof(PP_PARAMS_STRUCT));
//    if (pParams == NULL)
//        return FALSE;
/*
    ReadConfig(pParams);
*/

    psp.dwSize      = sizeof(PROPSHEETPAGE);
    psp.dwFlags     = PSP_USECALLBACK;
    psp.hInstance   = hInst;
    psp.pszTemplate = MAKEINTRESOURCE(IDD_PROPPAGE);
    psp.pfnDlgProc  = PropDialogProc;
    psp.lParam      = 0; //(LPARAM)pParams;
    psp.pfnCallback = PropPageCallback;

    hpsp = CreatePropertySheetPage(&psp);
    if (hpsp == NULL)
        return FALSE;

    if (!(*addProc)(hpsp, lParam))
    {
        DestroyPropertySheetPage(hpsp);
        return FALSE;
    }

    return TRUE;
}

UINT CALLBACK PropPageCallback(HWND hwnd, UINT uMsg, LPPROPSHEETPAGE pPsp)
{
//    PP_PARAMS_STRUCT*   pParams;

    
    if (uMsg == PSPCB_RELEASE)
    {
/*
        pParams = (PP_PARAMS_STRUCT*)pPsp->lParam;

        if (pParams->drvConfigKeyValid)
            RegCloseKey(pParams->drvConfigKey);

        if (pParams->svcConfigKeyValid)
            RegCloseKey(pParams->svcConfigKey);
        LocalFree(pParams);
*/
    }

    return TRUE;
}

void CheckSettings(HWND hwnd)
{
	BOOL bW1 = FALSE;
	char s[1000] = "";

	for (int i=0; i<MAXPAIR; i++)
	{
		BOOL bWarning = FALSE;

		if ((m_iCom1[i] && (!m_iCom2[i])) || ((!m_iCom1[i]) && m_iCom2[i]))
			bWarning = TRUE; // one is 0, other !0

		if ( (m_iCom1[i]!=0) && (m_iCom2[i]!=0) && (m_iCom1[i]==m_iCom2[i]) )
			bWarning = TRUE; // one == other 
		
		for (int j=0; j<i; j++)
		{
			if ( (m_iCom1[i] == m_iCom2[j]) && (m_iCom1[i]!=0))
				bWarning = TRUE; // same numbers

			if ( (m_iCom1[j] == m_iCom2[i]) && (m_iCom1[j]!=0))
				bWarning = TRUE; // same numbers

			if ( (m_iCom1[i] == m_iCom1[j]) && (m_iCom1[i]!=0))
				bWarning = TRUE; // same numbers

			if ( (m_iCom2[i] == m_iCom2[j]) && (m_iCom2[i]!=0))
				bWarning = TRUE; // same numbers
		}

		if (bWarning)
		{
			if (!bW1)
			{
				strcat(s, "Warning! Conflict in pair(s):");
				bW1 = TRUE;
			}

			char ss[10];
			itoa(i+1,ss,10); 

			strcat(s, " ");
			strcat(s, ss);
		}

	}

	HWND hwndText = GetDlgItem(hwnd, IDC_TEXT);
	SetWindowText(hwndText, s);
}


BOOL CALLBACK PropDialogProc(HWND hwnd, UINT uMessage, WPARAM  wParam, LPARAM  lParam)
{
    UINT                btnState;
    char                valStr[5];
//    PP_PARAMS_STRUCT*   pParams;


    switch (uMessage)
    {
        case WM_INITDIALOG:
			{
			  #ifdef _DEBUG
//				pParams = (PP_PARAMS_STRUCT*)LocalAlloc(LPTR, sizeof(PP_PARAMS_STRUCT));
	//            ReadConfig(pParams);
			  #else   // !_DEBUG
//				pParams = (PP_PARAMS_STRUCT*)((LPPROPSHEETPAGE)lParam)->lParam;
			  #endif  // _DEBUG
//				SetWindowLong(hwnd, DWL_USER, (LONG)pParams);

	//            SendMessage(GetDlgItem(hwnd, IDC_TIMEOUT_SLIDER), TBM_SETRANGE, FALSE, MAKELONG(1, 10));
	//            UpdatePropPageControls(hwnd);

				ReadConfig(hwnd);

				HWND hwndCombo1 = GetDlgItem(hwnd, IDC_COMBO_1);
				HWND hwndCombo2 = GetDlgItem(hwnd, IDC_COMBO_2);

				HWND hwndComboPair = GetDlgItem(hwnd, IDC_COMBO_PAIR);

				// Pairs

				for (int i=1; i<=MAXPAIR; i++)
				{
					char s[20] = "Pair #";
					itoa(i,s+6,10);

					SendMessage(hwndComboPair, CB_ADDSTRING, 0, (LPARAM) s); 
				}

				SendMessage(hwndComboPair, CB_SETCURSEL, 0, 0); 

				// Port numbers

				SendMessage(hwndCombo1, CB_ADDSTRING, 0, (LPARAM) "Unassigned"); 
				SendMessage(hwndCombo2, CB_ADDSTRING, 0, (LPARAM) "Unassigned"); 

				char s[10] = "COM";

				for (i=1; i<=MAXPORT; i++)
				{
					//sprintf(s, "COM%i",i);
					itoa(i,s+3,10);

					SendMessage(hwndCombo1, CB_ADDSTRING, 0, (LPARAM) s); 
					SendMessage(hwndCombo2, CB_ADDSTRING, 0, (LPARAM) s); 
				}

				int n;

				SendMessage(hwndCombo1, CB_SETCURSEL, m_iCom1[0], 0); 
				SendMessage(hwndCombo2, CB_SETCURSEL, m_iCom2[0], 0); 

				CheckSettings(hwnd);

			}
            return TRUE;
/*
        case WM_HSCROLL:
            pParams = (PP_PARAMS_STRUCT*)GetWindowLong(hwnd, DWL_USER);

            pParams->timeoutScaling = SendMessage((HWND)lParam, TBM_GETPOS, 0, 0);

            sprintf(valStr, "x %d", pParams->timeoutScaling);
            SetDlgItemText(hwnd, IDC_SCALING, valStr);

            break;
*/

        case WM_COMMAND:
//            pParams = (PP_PARAMS_STRUCT*)GetWindowLong(hwnd, DWL_USER);

			if (HIWORD(wParam) == CBN_SELCHANGE)
			{
				HWND hwndCombo1 = GetDlgItem(hwnd, IDC_COMBO_1);
				HWND hwndCombo2 = GetDlgItem(hwnd, IDC_COMBO_2);

				HWND hwndComboPair = GetDlgItem(hwnd, IDC_COMBO_PAIR);
				int iPair = SendMessage(hwndComboPair, CB_GETCURSEL, 0, 0); 

				if (LOWORD(wParam) == IDC_COMBO_PAIR)
				{
					SendMessage(hwndCombo1, CB_SETCURSEL, m_iCom1[iPair], 0); 
					SendMessage(hwndCombo2, CB_SETCURSEL, m_iCom2[iPair], 0); 
				}
				else				
				if (LOWORD(wParam) == IDC_COMBO_1)
				{
					m_iCom1[iPair] = SendMessage(hwndCombo1, CB_GETCURSEL, 0, 0); 
				}
				else
				if (LOWORD(wParam) == IDC_COMBO_2)
				{
					m_iCom2[iPair] = SendMessage(hwndCombo2, CB_GETCURSEL, 0, 0); 
				}

				CheckSettings(hwnd);
			}

            switch (LOWORD(wParam))
            {

/*
                case IDC_ALL_LINES:
                    if (HIWORD(wParam) == BN_CLICKED)
                    {
                        btnState = IsDlgButtonChecked(hwnd, IDC_ALL_LINES);

                        if (btnState == BST_CHECKED)
                        {
                            pParams->statusLines = MS_CTS_ON | MS_DSR_ON |
                                                   MS_RING_ON | MS_RLSD_ON;
                        }
                        else if (btnState == BST_INDETERMINATE)
                        {
                            CheckDlgButton(hwnd, IDC_ALL_LINES, BST_UNCHECKED);
                            btnState = BST_UNCHECKED;

                            pParams->statusLines = 0;
                        }
                        else
                            pParams->statusLines = 0;

                        CheckDlgButton(hwnd, IDC_CTS, btnState);
                        CheckDlgButton(hwnd, IDC_DSR, btnState);
                        CheckDlgButton(hwnd, IDC_RI, btnState);
                        CheckDlgButton(hwnd, IDC_DCD, btnState);
                    }
                    break;

                case IDC_CTS:
                    if (HIWORD(wParam) == BN_CLICKED)
                    {
                        btnState = IsDlgButtonChecked(hwnd, IDC_CTS);

                        if (btnState == BST_CHECKED)
                            pParams->statusLines |= MS_CTS_ON;
                        else
                            pParams->statusLines &= ~MS_CTS_ON;

                        UpdatePropPageControls(hwnd);
                    }
                    break;

                case IDC_DSR:
                    if (HIWORD(wParam) == BN_CLICKED)
                    {
                        btnState = IsDlgButtonChecked(hwnd, IDC_DSR);

                        if (btnState == BST_CHECKED)
                            pParams->statusLines |= MS_DSR_ON;
                        else
                            pParams->statusLines &= ~MS_DSR_ON;

                        UpdatePropPageControls(hwnd);
                    }
                    break;

                case IDC_RI:
                    if (HIWORD(wParam) == BN_CLICKED)
                    {
                        btnState = IsDlgButtonChecked(hwnd, IDC_RI);

                        if (btnState == BST_CHECKED)
                            pParams->statusLines |= MS_RING_ON;
                        else
                            pParams->statusLines &= ~MS_RING_ON;

                        UpdatePropPageControls(hwnd);
                    }
                    break;

                case IDC_DCD:
                    if (HIWORD(wParam) == BN_CLICKED)
                    {
                        btnState = IsDlgButtonChecked(hwnd, IDC_DCD);

                        if (btnState == BST_CHECKED)
                            pParams->statusLines |= MS_RLSD_ON;
                        else
                            pParams->statusLines &= ~MS_RLSD_ON;

                        UpdatePropPageControls(hwnd);
                    }
                    break;

                case IDC_DEFAULT:
                    pParams->timeoutScaling    = 1;
                    pParams->statusLines       = 0;
                    pParams->activeConnectOnly = 0;

                    UpdatePropPageControls(hwnd);

                    break;

                case IDC_ABOUT:
                    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT_DIALOG), hwnd, AboutDialogProc);
                    break;
*/
            }

            return TRUE;

        case WM_NOTIFY:
            if (((LPNMHDR)lParam)->code != PSN_APPLY)
                return FALSE;

            //pParams = (PP_PARAMS_STRUCT*)GetWindowLong(hwnd, DWL_USER);
            WriteConfig(hwnd);

			//MessageBox(0,"OK","",0);
//            SetWindowLong(hwnd, DWL_MSGRESULT, PSNRET_NOERROR);
            return TRUE;
/*
        case WM_HELP:
            WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle, IRCOMM2K_HELPFILE,  HELP_WM_HELP,
                    (DWORD)helpIDs);
            break;

      #ifdef _DEBUG
        case WM_CLOSE:
            pParams = (PP_PARAMS_STRUCT*)GetWindowLong(hwnd, DWL_USER);
            WriteConfig(hwnd, pParams);
            if (pParams->drvConfigKeyValid)
                RegCloseKey(pParams->drvConfigKey);
            LocalFree(pParams);
            EndDialog(hwnd, 0);
            return TRUE;
      #endif  // _DEBUG
*/
    }
    return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -