首页
社区
课程
招聘
[旧帖] 新手求助windows核心编程示例 0.00雪花
发表于: 2016-6-9 18:22 7051

[旧帖] 新手求助windows核心编程示例 0.00雪花

2016-6-9 18:22
7051
/******************************************************************************
Module:  Singleton.cpp
Notices: Copyright (c) 2008 Jeffrey Richter & Christophe Nasarre
******************************************************************************/

#include "resource.h"

#include "CmnHdr.h"     /* See Appendix A. */
#include <windowsx.h>
#include <Sddl.h>          // for SID management
#include <tchar.h>
#include <strsafe.h>

///////////////////////////////////////////////////////////////////////////////

// Main dialog
HWND     g_hDlg;

// Mutex, boundary and namespace used to detect previous running instance
HANDLE   g_hSingleton = NULL;
HANDLE   g_hBoundary = NULL;
HANDLE   g_hNamespace = NULL;

// Keep track whether or not the namespace was created or open for clean-up
BOOL     g_bNamespaceOpened = FALSE;

// Names of boundary and private namespace
PCTSTR   g_szBoundary = TEXT("3-Boundary");
PCTSTR   g_szNamespace = TEXT("3-Namespace");

#define DETAILS_CTRL GetDlgItem(g_hDlg, IDC_EDIT_DETAILS)

///////////////////////////////////////////////////////////////////////////////

// Adds a string to the "Details" edit control
void AddText(PCTSTR pszFormat, ...) {

        va_list argList;
        va_start(argList, pszFormat);

        TCHAR sz[20 * 1024];

        Edit_GetText(DETAILS_CTRL, sz, _countof(sz));
        _vstprintf_s(
                _tcschr(sz, TEXT('\0')), _countof(sz) - _tcslen(sz),
                pszFormat, argList);
        Edit_SetText(DETAILS_CTRL, sz);
        va_end(argList);
}

///////////////////////////////////////////////////////////////////////////////

void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) {

        switch (id) {
        case IDOK:
        case IDCANCEL:
                // User has clicked on the Exit button
                // or dismissed the dialog with ESCAPE
                EndDialog(hwnd, id);
                break;
        }
}

///////////////////////////////////////////////////////////////////////////////

void CheckInstances() {

        // Create the boundary descriptor
        g_hBoundary = CreateBoundaryDescriptor(g_szBoundary, 0);

        // Create a SID corresponding to the Local Administrator group
        BYTE localAdminSID[SECURITY_MAX_SID_SIZE];
        PSID pLocalAdminSID = &localAdminSID;
        DWORD cbSID = sizeof(localAdminSID);
        if (!CreateWellKnownSid(
                WinBuiltinAdministratorsSid, NULL, pLocalAdminSID, &cbSID)
                ) {
                AddText(TEXT("AddSIDToBoundaryDescriptor failed: %u\r\n"),
                        GetLastError());
                return;
        }

        // Associate the Local Admin SID to the boundary descriptor
        // --> only applications running under an administrator user
        //     will be able to access the kernel objects in the same namespace
        if (!AddSIDToBoundaryDescriptor(&g_hBoundary, pLocalAdminSID)) {
                AddText(TEXT("AddSIDToBoundaryDescriptor failed: %u\r\n"),
                        GetLastError());
                return;
        }

        // Create the namespace for Local Administrators only
        SECURITY_ATTRIBUTES sa;
        sa.nLength = sizeof(sa);
        sa.bInheritHandle = FALSE;
        if (!ConvertStringSecurityDescriptorToSecurityDescriptor(
                TEXT("D:(A;;GA;;;BA)"),
                SDDL_REVISION_1, &sa.lpSecurityDescriptor, NULL)) {
                AddText(TEXT("Security Descriptor creation failed: %u\r\n"), GetLastError());
                return;
        }

        g_hNamespace =
                CreatePrivateNamespace(&sa, g_hBoundary, g_szNamespace);

        // Don't forget to release memory for the security descriptor
        LocalFree(sa.lpSecurityDescriptor);

        // Check the private namespace creation result
        DWORD dwLastError = GetLastError();
        if (g_hNamespace == NULL) {
                // Nothing to do if access is denied
                // --> this code must run under a Local Administrator account
                if (dwLastError == ERROR_ACCESS_DENIED) {
                        AddText(TEXT("Access denied when creating the namespace.\r\n"));
                        AddText(TEXT("   You must be running as Administrator.\r\n\r\n"));
                        return;
                }
                else {
                        if (dwLastError == ERROR_ALREADY_EXISTS) {
                                // If another instance has already created the namespace,
                                // we need to open it instead.
                                AddText(TEXT("CreatePrivateNamespace failed: %u\r\n"), dwLastError);
                                g_hNamespace = OpenPrivateNamespace(g_hBoundary, g_szNamespace);
                                if (g_hNamespace == NULL) {
                                        AddText(TEXT("   and OpenPrivateNamespace failed: %u\r\n"),
                                                dwLastError);
                                        return;
                                }
                                else {
                                        g_bNamespaceOpened = TRUE;
                                        AddText(TEXT("   but OpenPrivateNamespace succeeded\r\n\r\n"));
                                }
                        }
                        else {
                                AddText(TEXT("Unexpected error occured: %u\r\n\r\n"),
                                        dwLastError);
                                return;
                        }
                }
        }

        // Try to create the mutex object with a name
        // based on the private namespace
        TCHAR szMutexName[64];
        StringCchPrintf(szMutexName, _countof(szMutexName), TEXT("%s\\%s"),
                g_szNamespace, TEXT("Singleton"));

        g_hSingleton = CreateMutex(NULL, FALSE, szMutexName);
        if (GetLastError() == ERROR_ALREADY_EXISTS) {
                // There is already an instance of this Singleton object
                AddText(TEXT("Another instance of Singleton is running:\r\n"));
                AddText(TEXT("--> Impossible to access application features.\r\n"));
        }
        else  {
                // First time the Singleton object is created
                AddText(TEXT("First instance of Singleton:\r\n"));
                AddText(TEXT("--> Access application features now.\r\n"));
        }
}

///////////////////////////////////////////////////////////////////////////////

BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) {

        chSETDLGICONS(hwnd, IDI_SINGLETON);

        // Keep track of the main dialog window handle
        g_hDlg = hwnd;

        // Check whether another instance is already running
        CheckInstances();

        return(TRUE);
}

///////////////////////////////////////////////////////////////////////////////

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

        switch (uMsg) {
                chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand);
                chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);
//未定义的标识符,HANLDE0x0110
        }

        return(FALSE);
}

///////////////////////////////////////////////////////////////////////////////

int APIENTRY _tWinMain(HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPTSTR    lpCmdLine,
        int       nCmdShow)
{
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);

        // Show main window
        DialogBox(hInstance, MAKEINTRESOURCE(IDD_SINGLETON), NULL, Dlg_Proc);

        // Don't forget to clean up and release kernel resources
        if (g_hSingleton != NULL) {
                CloseHandle(g_hSingleton);
        }

        if (g_hNamespace != NULL) {
                if (g_bNamespaceOpened) {  // Open namespace
                        ClosePrivateNamespace(g_hNamespace, 0);
                }
                else { // Created namespace
                        ClosePrivateNamespace(g_hNamespace, PRIVATE_NAMESPACE_FLAG_DESTROY);
                }
        }

        if (g_hBoundary != NULL) {
                DeleteBoundaryDescriptor(g_hBoundary);
        }

        return(0);
}

//////////////////////////////// End of File //////////////////////////////////

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 1140
活跃值: (102)
能力值: ( LV4,RANK:48 )
在线值:
发帖
回帖
粉丝
2
这两个宏定义在CmnHdr.h中,243行,你肯定是没有成功包含这个头文件
2016-6-9 21:13
0
雪    币: 96
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
/////////////////////chHANDLE_DLGMSG Macro////////////////////////////////////////////////////
//The normal HANDLE_MSG macro in Windowsx.h does not work properly for dialog
//boxes because DlgProc returns a BOOL instead of an LRESULT (like
//WndProc).This chHANDLE_DLGMSG macro corrects the problem:
#define chHANDLE_DLGMSG(hWnd, message, fn)                \
   case (message) : return (SetDlgMsgResult(hWnd, uMsg,   \
           HANDLE_##message((hWnd), (wParam), (lParam), (fn))))
////////////////////////////////////Dialog Box Icon Setting Macro////////////////////////////
这个是我第二行的头文件的内容,我觉得没错啊?注:我用的VS2013版本比书中要求的2008版本高
2016-6-9 21:24
0
雪    币: 333
活跃值: (161)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
未定义的标识 应该是没有包含头文件
你有没有把那个头文件放到同一目录下 ···
2016-6-10 09:50
0
雪    币: 1140
活跃值: (102)
能力值: ( LV4,RANK:48 )
在线值:
发帖
回帖
粉丝
5
头文件路径可能错了
2016-6-10 10:58
0
雪    币: 96
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
在同一目录下,而且头文件中其他的宏定义都可以,我已经直接把这个宏定义扔到主文件里面了,但是还是显示未定义的标识
2016-6-10 11:10
0
雪    币: 96
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
头文件路径如果错了,就会无法打开头文件的吧
2016-6-10 11:11
0
雪    币: 333
活跃值: (161)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
把这句#include "CmnHdr.h"   
放到#include <strsafe.h>后面试试
我以前编译的时候也遇到过 后面就换位置就好了 我也没想明白为什么
2016-6-10 14:45
0
雪    币: 96
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
能编译出窗口不?我直接把宏定义撤了写了的case进去,编译通过但是不出现窗口啊。。。
照你这么改错误更多
2016-6-10 15:03
0
雪    币: 96
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我已经直接把宏定义放在了该调用之前,还是出现了未定义的标识
最后直接把扩展自己写到函数里面,成功编译,但是窗口没出来,估计是因为win7平台的原因
win核心编程这本书还是有点老(前后快10年),不能搬代码,学学思想就好了
2016-6-10 16:41
0
游客
登录 | 注册 方可回帖
返回
//