2015-01-19 7 views
0

을 실행하는 데 실패하고이 오류를 가지고 : WTclient은 - OPCENUM 내 코드는 매우 간단하고 내가 실행하지 못했습니다 완벽하게 작동하는 인터넷에서 찾은 예제 응용 프로그램을 따르십시오. 내 프로그램이 완벽하게 컴파일되고 실행되지만 Numbr = NumberOfOPCServers (TRUE, MachineName)에 도달하면; 그 라인 오류가 나타납니다.오류 : WTclient은 - OPCENUM에게 내가 도착하고 OPC 서버에 태그를 보내기 위해 OPC 클라이언트를 쓰고 있어요

내 .ccp은 다음과 같습니다

int CWTclientApp::GetServerListFromOPCENUM(CString pathname) 
{ 
    IOPCServerList *gpOPC; 
    HRESULT hr, hr2; 
    IEnumGUID *pEnumGUID; 
    CLSID catid, clsid; 
    unsigned long c; 
    LPOLESTR pszProgID, pszUserType; 
    int i; 
    OPCSVRDESCR *pSvr; 

    for (i=0; i<MyServerList.GetSize(); i++) 
     { 
     pSvr = (OPCSVRDESCR *)MyServerList.GetAt(i); 
     delete (pSvr); 
     } 
    MyServerList.RemoveAll(); 

    // create the enumerator object 
    gpOPC = CreateServerEnumerator(pathname); 
    if (gpOPC == NULL) 
     { 
     DoErrorMsg (0, "Failed to Execute OPCENUM"); 
     // revert to search of Registry if OPCENUM fails to execute 
     return (GetServerListFromRegistry()); 
     } 
............................................ 

() 함수 NumberOfOPCServers에서 호출됩니다 : 깊이 다른 인터넷 예

#include "stdafx.h" 
#include "opcda.h" 
#include "opc_ae.h" 
#include "wtclientapi.h" 
#include "OPC2.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int Numbr; 
    MachineName = ""; 
    Numbr = NumberOfOPCServers(TRUE, MachineName); 
    return 0; 
} 

디버깅,이 함수에서 온 그 오류를 발견했습니다 :

_declspec(dllexport) int WINAPI NumberOfOPCServers (bool UseOPCENUM, LPCSTR MachineName) 
{ 
    CWTclientApp *pApp; 
    CString path; 

    path = MachineName; 
    path.MakeUpper(); 
    if (path == "LOCAL") 
     path = ""; 
    else 
     path = MachineName; 
    pApp = (CWTclientApp *)AfxGetApp(); 
    if (UseOPCENUM) 
     return (pApp->GetServerListFromOPCENUM(path)); 
    else 
     return (pApp->GetServerListFromRegistry()); 
} 

왜이 오류가 발생합니까? OPCenum.exe가 내 컴퓨터 (로컬 서버)에서 실행중인 OPC 서버를 열거하지 않는 것 같지만 그 이유는 무엇입니까? (다운로드 된 응용 프로그램을 수행하고 광산하지 않습니다와 함께)

감사합니다 !!!!

편집 --------------------------------------------- --------------------------- CreateServerEnumerator() :

IOPCServerList *CWTclientApp::CreateServerEnumerator (CString PathName) 
{ 
    HRESULT r2; 
    MULTI_QI mqi; 
    COSERVERINFO sin, *sinptr; 
    DWORD clsctx; 

    // set up server info 
    // 
    if (PathName.GetLength() > 0) 
     { 
     sinptr = &sin; 
     sin.dwReserved1 = 0; 
     sin.dwReserved2 = 0; 
     sin.pwszName = WSTRFromCString (PathName, FALSE); 
     sin.pAuthInfo = 0; 
     clsctx = CLSCTX_REMOTE_SERVER; 
     } 
    else 
     { 
     sinptr = 0;  // pointer should be NULL if local 
     clsctx = CLSCTX_LOCAL_SERVER; 
     } 

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

    r2 = CoCreateInstanceEx(CLSID_OPCServerList, NULL, 
     clsctx, sinptr, 1, &mqi);  
    if (PathName.GetLength() > 0) 
     WSTRFree (sin.pwszName, FALSE);  
    if (FAILED(r2) || FAILED(mqi.hr)) 
     return (NULL);  
    return (IOPCServerList*)mqi.pItf; 
} 
+0

는 CreateServerEnumerator에 소스 코드가 있습니까? – ZbynekZ

+0

@ZbynekZ, 예, 질문이 수정되었습니다. –

+0

r2 값 -> r2 = 0x800401f0 : CoInitialize가 호출되지 않았습니다. –

답변

0

간단히으로 CoInitialize (https://msdn.microsoft.com/en-us/library/windows/desktop/ms678543(v=vs.85).aspx) 또는 CoInitializeEx에서 전화 (https://msdn.microsoft.com/en-us/library/windows/desktop/ms695279(v=vs.85).aspx) 다른 COM 기능을 호출하기 전에 COM (OPC Classic)을 사용하는 각 스레드에서.

으로 CoInitialize가 사용되지 않습니다, 당신은 때문에 오히려 CoInitializeEx에서 사용해야합니다. "CoInitializeEx에서 한 번 이상 호출해야하며, 일반적으로 COM 라이브러리를 사용하는 각 스레드, 한 번만 호출됩니다"

Microsoft는이 기능에 대한 자신의 문서를 말한다.

+0

답변 해 주셔서 감사합니다. 그것은 작동합니다!. 방금 WTclientCoInit()를 호출했습니다. 코드의 시작 부분과 WTclientCoUninit(); 결국. –