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

📄 myserverb.cpp

📁 【内容简介】 本书由一流的权威撰写
💻 CPP
字号:
// MyServerB.cpp : Implementation of CServerBApp and DLL registration.

#include "stdafx.h"
#include "ServerB.h"
#include "MyServerB.h"
#include "../ServerC/ServerC.h"
#include "../ServerC/ServerC_i.c"

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

STDMETHODIMP CMyServerB::InterfaceSupportsErrorInfo(REFIID riid)
{
	static const IID* arr[] = 
	{
		&IID_IMyServerB,
	};

	for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
	{
		if (InlineIsEqualGUID(*arr[i],riid))
			return S_OK;
	}
	return S_FALSE;
}

static _bstr_t GetLocalFileName()
{
	TCHAR szModule[_MAX_PATH];
	GetModuleFileName(_pModule->GetModuleInstance(), szModule, _MAX_PATH);

	TCHAR szDrive[_MAX_DRIVE], szDir[_MAX_DIR];
	_tsplitpath(szModule, szDrive, szDir, NULL, NULL);

	_bstr_t bRetVal = szDrive;
	bRetVal += szDir;
	bRetVal += "LocalFileB.txt";
	return bRetVal;
}

_bstr_t GetRemoteFileName()
{
	return "\\\\PVDC\\Data\\NetFile.txt";
}

CComBSTR OpenFileForReadOnly(LPCTSTR pszFileName)
{
	HANDLE h = ::CreateFile(pszFileName,
		GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

	if (INVALID_HANDLE_VALUE == h) {
		HRESULT hr = HRESULT_FROM_WIN32(::GetLastError());
		if (S_OK == hr) hr = E_FAIL; // Odd! GetLastError shouldn't return success
		return _com_error(hr).ErrorMessage();
	}

	::CloseHandle(h);
	return "SUCCEEDED";
}

STDMETHODIMP CMyServerB::DoIt(long lDelegate, BSTR *pbsRetVal)
{
	// Get the security interface pointer
	CComPtr<IServerSecurity> spSec;
	HRESULT hr = ::CoGetCallContext(__uuidof(IServerSecurity), (void**) &spSec);
	if (FAILED(hr)) {
		return Error(_T("Error getting call context"), __uuidof(IMyServerB), hr);
	}

	// Impersonate the client
	hr = spSec->ImpersonateClient();
	if (FAILED(hr)) {
		return Error(_T("Error impersonating client"), __uuidof(IMyServerB), hr);
	}

	// Check if you can open a local file
	CComBSTR bsOutput = "ServerB - Local file open: ";
	bsOutput += OpenFileForReadOnly(GetLocalFileName());

	// Check if you can open a network file
	bsOutput += "\nServerB - Network file open: ";
	bsOutput += OpenFileForReadOnly(GetRemoteFileName());

	// Now lets try it on the remote server
	IUnknownPtr spUnkC;
	hr = CPLCreateInstance(OLESTR("PVDC"), CLSID_MyServerC,	&spUnkC);
	if (FAILED(hr)) {
		bsOutput += "\nCould not create remote instance: ";
		bsOutput += _com_error(hr).ErrorMessage();
		*pbsRetVal = bsOutput.Detach();
		return S_OK;
	}

	CComPtr<IMyServerC> spServerC;
	hr = spUnkC->QueryInterface(&spServerC);
	if (FAILED(hr)) {
		bsOutput += "\nQI on remote instance failed: ";
		bsOutput += _com_error(hr).ErrorMessage();
		*pbsRetVal = bsOutput.Detach();
		return S_OK;
	}

	DWORD dwCapability = EOAC_NONE;
	DWORD dwImpLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
	if (lDelegate > 0) {
		dwImpLevel = RPC_C_IMP_LEVEL_DELEGATE;
		if (1 == lDelegate) {
			dwCapability = EOAC_NONE; // no cloaking
		}else
		if (2 == lDelegate) {
			dwCapability = EOAC_DYNAMIC_CLOAKING;
		}
	}

	CComPtr<IClientSecurity> spClientSec;
	hr = spServerC->QueryInterface(&spClientSec);
	if (FAILED(hr)) {
		bsOutput += "\nQI for IClientSecurity on remote instance failed: ";
		bsOutput += _com_error(hr).ErrorMessage();
	}else {
		hr = spClientSec->SetBlanket(spServerC, 
			RPC_C_AUTHN_DEFAULT,
			RPC_C_AUTHZ_DEFAULT,
			NULL,
			RPC_C_AUTHN_LEVEL_DEFAULT,
			dwImpLevel,
			NULL,
			dwCapability);
		if (FAILED(hr)) {
			bsOutput += "\nSet blanket failed: ";
			bsOutput += _com_error(hr).ErrorMessage();
		}
	}


	CComBSTR bsOutputFromRemoteMachine;
	hr = spServerC->DoIt(&bsOutputFromRemoteMachine);
	if (FAILED(hr)) {
		bsOutput += "\nDoIt on remote instance failed: ";
		bsOutput += _com_error(hr).ErrorMessage();
		*pbsRetVal = bsOutput.Detach();
		return S_OK;
	}

	bsOutput += "\n";
	bsOutput += bsOutputFromRemoteMachine;

	*pbsRetVal = bsOutput.Detach();

	return S_OK;
}

⌨️ 快捷键说明

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