📄 opctest.cpp
字号:
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 + -