首先声明一下,常搜索到的函数 CLSIDFromProgID 只能查询本地注册表的值,如果OPC Server与客户端不在同一台服务器,这个函数就没有用。
另一种连接方式,是通过opc server的CLSID(打开注册表 ,计算机\HKEY_CLASSES_ROOT\服务名),再通过 CLSIDFromString 函数,这种方式有些取巧,不过也能实现功能。具体如下
CLSID clsid_citect;
COSERVERINFO si;
ZeroMemory(&si, sizeof(si)); //内存1 存放服务器信息
MULTI_QI mqi[1];
ZeroMemory(&mqi, sizeof(mqi)); //内存2 存放MULTI_QI用以获取OPC服务器列表
//获取服务器列表,用到了OPCEnum.exe
CString strIP = L"192.168.5.93";
si.pwszName = (LPWSTR)(strIP.GetString()); //Covert CString to LPWSTR 把服务器名转为宽字节字符串
HRESULT hr;
CLSIDFromString(L"{3FB14190-DEF2-4bba-998A-719C49C74DE1}", &clsid_citect);//PCAuto.OPCServer
mqi[0].hr = S_OK;
mqi[0].pIID = &IID_IOPCServer;
mqi[0].pItf = NULL;
hr = CoCreateInstanceEx(clsid_citect, NULL, CLSCTX_ALL, &si, 1, mqi);
if(hr != S_OK)
printf("\CoCreateInstanceEx Ret = 0x%08X\n",hr);
if (FAILED(hr))