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

📄 opctest.cpp

📁 工业标准通讯OPC协议的客户端测试源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	MULTI_QI mqi;
	COSERVERINFO	sin, *sinptr;
	DWORD clsctx;

	// Get the CLSID from the Name
	// zzz NOTE this is a call to the LOCAL registry!
	//
	r1 = CLSIDFromProgID(szProgID, &clsid);
	if(FAILED(r1))
	{
		printf("CLSIDFromProgID failed for %ls (%lx)\n", szProgID, r1);
		return NULL;
	}

	// set up server info
	//
	if(*szNodeName)
	{
		sinptr = &sin;
		sin.dwReserved1 = 0;
		sin.dwReserved2 = 0;
		sin.pwszName = szNodeName;
		sin.pAuthInfo = 0;
		clsctx = CLSCTX_REMOTE_SERVER;
	} else
	{
		// If NODE is Nul then try local server
		sinptr = 0;		// pointer should be NULL if local
		clsctx = CLSCTX_LOCAL_SERVER;
	}

	// set up mqi
	//
	mqi.pIID = &IID_IUnknown;
	mqi.hr = 0;
	mqi.pItf = 0;

	// Note you must define _WIN32_DCOM in 'Settings'
	r2 = CoCreateInstanceEx(clsid, NULL, 
		clsctx, sinptr, 1, &mqi);

	if (FAILED(r2) || FAILED(mqi.hr))
	{
		printf("CoCreateInstanceEx - failed for node:%ls ProgID:%ls (%lx)\n", szNodeName, szProgID, r2);
		return NULL;
	}

	printf("Remote Object (with IUnknown) Created for %ls\n", szProgID);
	return (IUnknown*)mqi.pItf;
}


//---------------------------------------------------------
// CreateServer INPROC
// Create the requested OPC Server
IUnknown *CreateInprocOPCServer(WCHAR*szName)
{
	CLSID clsid;
	IClassFactory *pCF;
	HRESULT r1, r2, r3;
	IUnknown * pOPC;

	// Get the CLSID from the Name
	r1 = CLSIDFromProgID(szName, &clsid);
	if(FAILED(r1))
	{
		printf("CLSIDFromProgID failed for %ls\n", szName);
		return NULL;
	}

	// Create an OPC Sample Server Class Factory
	//
	r2 = CoGetClassObject(clsid, CLSCTX_INPROC_SERVER , //try inproc first
		NULL, IID_IClassFactory, (void**)&pCF);

	if (FAILED(r2))
	{
		printf("CoGetClassObject- no InProc server for (%lx)\n", r2);
		return NULL;
	}

	// And use the class factory to create the OPC Server
	// Request an IUnknown Interface to it
	// and release the class factory which is no longer needed
	//
	r3 = pCF->CreateInstance(NULL, IID_IUnknown, (void**)&pOPC);

	pCF->Release();

	if (FAILED(r3))
	{
		printf("Error from CreateInstance (%lx)\n", r3);
		return NULL;
	}
	printf("Inproc Object (with IUnknown) Created for %ls\n", szName);
	return pOPC;
}

//---------------------------------------------------------
// CreateServer LOCAL
// Create the requested OPC Server
IUnknown *CreateLocalOPCServer(WCHAR*szName)
{
	CLSID clsid;
	IClassFactory *pCF;
	HRESULT r1, r2, r3;
	IUnknown * pOPC;

	// Get the CLSID from the Name
	r1 = CLSIDFromProgID(szName, &clsid);
	if(FAILED(r1))
	{
		printf("CLSIDFromProgID failed for %ls\n", szName);
		return NULL;
	}

	// Create an OPC Sample Server Class Factory
	//
	r2 = CoGetClassObject(clsid, CLSCTX_LOCAL_SERVER , //try inproc first
		NULL, IID_IClassFactory, (void**)&pCF);

	if (FAILED(r2))
	{
		printf("CoGetClassObject- no Local server for (%lx)\n", r2);
		return NULL;
	}

	// And use the class factory to create the OPC Server
	// Request an IUnknown Interface to it
	// and release the class factory which is no longer needed
	//
	r3 = pCF->CreateInstance(NULL, IID_IUnknown, (void**)&pOPC);

	pCF->Release();

	if (FAILED(r3))
	{
		printf("Error from CreateInstance (%lx)\n", r3);
		return NULL;
	}
	printf("Local Object (with IUnknown) Created for %ls\n", szName);
	return pOPC;
}


//---------------------------------------------------------
// TryIUnknown
//
void TryIUnknown(IUnknown *pOPC)
{
	HRESULT r4;

	// Try basic interface to see if it works at all...
	//
	r4 = pOPC->AddRef();
	if (FAILED(r4))
	{
		printf("Error from IUnknown AddRef(%lx)\n", r4);
		return;
	}
	pOPC->Release();
	printf("IUnknown test complete\n\n");
}


//---------------------------------------------------------
// TryOPCServer
// Use the OPCServer to perform some functions
void TryOPCServer(IOPCServer *pOPC)
{
	int loop;
	char buffer[40];

	loop = 1;
	while(loop)
	{

		printf("\n\nTest OPCServer Methods...\n");
		printf("0= AddGroup...\n");
		printf("1= GetErrorString...\n");
		printf("2= GetGroupByName...\n");
		printf("3= GetStatus...\n");
		printf("4= RemoveGroup...\n");
		printf("5= CreateGroupEnumerator(Unknown and String)...\n");
		printf("9= *Test the Group Interfaces*...\n");
		printf("x= Exit...\n\n");

		switch(*gets(buffer))
		{
		case '0':
			TryAddGroup(pOPC);
			break;
		case '1':
			TryGetErrorString(pOPC);
			break;
		case '2':
			//Note - Group1 will fail if you run the SetGroupName test!
			TryGetByName(pOPC, L"TestGroup1");	
			TryGetByName(pOPC, L"TestGroup2");
			break;
		case '3':
			TryGetStatus(pOPC);
			break;
		case '4':
			TryRemoveGroup(pOPC);
			break;
		case '5':
			TryEnumUnknown1(pOPC);
			TryEnumString(pOPC);
			break;

		case '9':
			TestGroup();
			break;

		case 'x':
			loop = 0;
			break;
		}
	}
	printf("IOPCServer test complete\n\n");
}


//---------------------------------------------------------
// TryGetStatus
// Use the OPCServer to perform some functions
void TryGetStatus(IOPCServer * pOPC)
{
	OPCSERVERSTATUS	*pss;
	HRESULT r1;

	// Invoke a method on the OPCServer interface
	//
	r1 = pOPC->GetStatus(&pss);

	if (FAILED(r1))
	{
		printf("Error from GetStatus(%lx)\n", r1);
	} 
	else
	{
		// And print some of the results of the method
		//
		printf("Status.szVendorInfo = %ls\n", pss->szVendorInfo);

		// Dont forget to release the memory returned by the method
		//
		pIMalloc->Free(pss->szVendorInfo);
		pIMalloc->Free(pss);
	}
}



//---------------------------------------------------------
// TryGetErrorString
// Use the OPCServer to perform some functions
void TryGetErrorString(IOPCServer * pOPC)
{
	HRESULT r1;
	LPWSTR s = 0;

	// Invoke a method on the OPCServer interface
	// zzz later ask user for error code
	//
	r1 = pOPC->GetErrorString(0, 0, &s);

	if (FAILED(r1))
	{
		printf("Error from GetErrorString(%lx)\n", r1);
	} 
	else
	{
		// And print some of the results of the method
		//
		printf("GetErrorString returned \"%ls\"\n", s);

		// Dont forget to release the memory returned by the method
		//
		pIMalloc->Free(s);
	}
}



// Globals for Group interfaces and handles
//
DWORD	hServerGroup1;
IUnknown          * pGRP1U = 0;
IOPCGroupStateMgt * pGRP1GSM = 0;
IOPCPublicGroupStateMgt * pGRP1PGSM = 0;
IOPCSyncIO        * pGRP1SIO = 0;
IOPCAsyncIO       * pGRP1ASIO = 0;
IOPCAsyncIO2      * pGRP1ASIO2 = 0;
IOPCItemMgt       * pGRP1IM = 0;
IDataObject       * pGRP1DO = 0;
IConnectionPointContainer * pGRP1CPC = 0;

DWORD	hServerGroup2;
IOPCGroupStateMgt * pGRP2 = 0;

DWORD	hServerGroup3;		// the cloned group
int bGroup3 = 0;		// do we need to remove it?


//---------------------------------------------------------
// TryAddGroup
// Use the OPCServer to add some groups
// and then try out the interfaces on the groups
//
void TryAddGroup(IOPCServer * pOPC)
{
	HRESULT r1;
	DWORD	RevisedRate1;
	DWORD	RevisedRate2;
	float	DeadBand1 = (float)0.0;
	float	DeadBand2 = (float)0.0;
	HRESULT r2, r3, r4, r5, r6, r8;
	HRESULT r9, r5a;

	// Try to create 2 groups (zzz later ask user for names)
	//
	if(pGRP1U == 0)
	{
		printf("First time through: Creating groups...\n");

		r1 = pOPC->AddGroup( L"TestGroup1", TRUE, 0, 0, 0, &DeadBand1,
			0, &hServerGroup1, &RevisedRate1, IID_IUnknown, 
			(LPUNKNOWN*)&pGRP1U);

		if (FAILED(r1))
		{
			printf("Error from AddGroup (TestGroup1) (%lx)\n", r1);
		} 
		else
		{
			printf("Checking Interfaces on Group 1...\n");

			r2 = pGRP1U->QueryInterface(IID_IOPCGroupStateMgt, (void**)&pGRP1GSM);
			r3 = pGRP1U->QueryInterface(IID_IOPCPublicGroupStateMgt, (void**)&pGRP1PGSM);
			r4 = pGRP1U->QueryInterface(IID_IOPCSyncIO, (void**)&pGRP1SIO);
			r5 = pGRP1U->QueryInterface(IID_IOPCAsyncIO, (void**)&pGRP1ASIO);
			r5a = pGRP1U->QueryInterface(IID_IOPCAsyncIO2, (void**)&pGRP1ASIO2);
			r6 = pGRP1U->QueryInterface(IID_IOPCItemMgt, (void**)&pGRP1IM);
			r8 = pGRP1U->QueryInterface(IID_IDataObject, (void**)&pGRP1DO);
			r9 = pGRP1U->QueryInterface(IID_IConnectionPointContainer, (void**)&pGRP1CPC);

			report("IUnknown               ", S_OK);
			report("IOPCGroupStateMgt      ", r2);
			report("IOPCPublicGroupStateMgt", r3);
			report("IOPCSyncIO             ", r4);
			report("IOPCAsyncIO            ", r5);
			report("IOPCAsyncIO2           ", r5a);
			report("IOPCItemMgt            ", r6);
			report("IDataObject            ", r8);
			report("IConnectionPointContainer", r9);
			printf("\n\n");
		}
	}
	else
	{
		printf("AddGroup already done...\n");
		return;
	}

	if( pGRP2 == 0)
	{
		r2 = pOPC->AddGroup( L"TestGroup2", TRUE, 0, 0, 0, &DeadBand2,
			0, &hServerGroup2, &RevisedRate2, IID_IOPCGroupStateMgt, 
			(LPUNKNOWN*)&pGRP2);

		if (FAILED(r2))
		{
			printf("Error from AddGroup (TestGroup2) (%lx)\n", r2);
		} 
	}
	printf("AddGroup test complete...\n");
}

//---------------------------------------------------------
// TestGroup
//
void TestGroup(void)
{

	int loop;
	char buffer[40];

	loop = 1;
	while(loop)
	{

		printf("\nTest OPCGroup Interfaces...\n");
		printf("0= GroupStateMgt...\n");
		printf("1= ItemMgt (Add some items)...\n");
		printf("2= SyncIO...\n");
		printf("3= AsyncIO, AsyncIO2...\n");
		printf("4= PublicGroupStateMgt...\n");
		printf("5= DataObject...\n");
		printf("6= ConnectionPoint...\n");
		printf("x= Exit...\n\n");

		switch(*gets(buffer))
		{
		case '0':
			if(pGRP1GSM) TryGSM( pGRP1GSM );
			break;
		case '1':
			if(pGRP1IM) TryIM( pGRP1IM );	// (Add items)
			break;
		case '2':
			if(pGRP1SIO) TryItemReadWrite(pGRP1SIO, 2, g_sh);
//			if(pGRP1SIO) TrySIO( pGRP1SIO );
			break;
		case '3':
			printf("This Interface is tested along with DataObject or ConnectionPoints\n");
//			if(pGRP1ASIO) TryASIO( pGRP1ASIO ); // need dataobj - maybe combine with trydo/trycpc

⌨️ 快捷键说明

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