主頁 > 軟體工程 > LNK2019símboloexternopublic:bool__thiscall…sinresolver

LNK2019símboloexternopublic:bool__thiscall…sinresolver

2022-01-22 01:24:42 軟體工程

我正在嘗試為我的專案編譯一個工具。到目前為止,我已經解決了所有問題,但我找不到這個問題的解決方案。

如果有人能給我幫助,我將不勝感激,謝謝。

NtlScriptEncrypter.cpp

#include "StdAfx.h"
#include "NtlScriptEncrypter.h"
#include "NtlXMLDoc.h"
#include "NtlFileSerializer.h"

#define CRYPT_PASSWORD "!@*&(agebreak"

CNtlScriptEncrypter::CNtlScriptEncrypter(void)
{
}

CNtlScriptEncrypter::~CNtlScriptEncrypter(void)
{
}

/**
 * ?á??±× ?3ᤠ??à?à? ·?μ???′ù. è?à?àú·? XML,EDF?| ±?o°??′ù.
 * \param pConfigData ·?μ??? μ¥àì?í?| àúà??ò ?÷à??í
 * \param szFileName ·?μ??ò ??à? àì?§
 * \return 
 */
BOOL CNtlScriptEncrypter::LoadConfigOption( OUT SConfigData* pConfigData, char* szFileName ) 
{
    if(!pConfigData || !szFileName)
        return FALSE;

    char szDrive[128]   = {0,};
    char szdir[128]     = {0,};
    char szfName[128]   = {0,};
    char szExt[128]     = {0,};
    _splitpath_s(szFileName, szDrive, szdir, szfName, szExt);    
    _strlwr_s(szExt);
    
    if(strcmp(szExt, ".xml") == 0)
    {
        return LoadConfigOptionXML(pConfigData, szFileName);
    }
    else if(strcmp(szExt, ".edf") == 0)
    {
        return LoadConfigOptionENC(pConfigData, szFileName);
    }

    return FALSE;
}

BOOL CNtlScriptEncrypter::LoadConfigOptionXML( OUT SConfigData* pConfigData, char* szFileName ) 
{
    CNtlXMLDoc doc;
    doc.Create();

    // xml doc load
    if(doc.Load( (char*)szFileName ) == false)
    {
        return FALSE;
    }

    char chBuffer[1024];

    // config operationà? ?ò????′ù.
    IXMLDOMNode* pNode = doc.SelectSingleNode((char*)"/config_options/op");

    if(!doc.GetTextWithAttributeName(pNode, "ver", chBuffer, 1024))
    {
        return FALSE;
    }

    if(!doc.GetTextWithAttributeName(pNode, "ip", chBuffer, 1024))
    {
        return FALSE;
    }

    pConfigData->strAddr = chBuffer;

    if(!doc.GetTextWithAttributeName(pNode, "port", chBuffer, 1024))
    {
        return FALSE;
    }

    pConfigData->dwPort = (DWORD)atoi(chBuffer);

    pNode->Release(); 

    // config localà? ?ò????′ù.

    pNode = doc.SelectSingleNode((char*)"/config_options/local");

    if(!doc.GetTextWithAttributeName(pNode, "ver", chBuffer, 1024))
    {
        return FALSE;
    }

    if(!doc.GetTextWithAttributeName(pNode, "local_dsp", chBuffer, 1024))
    {
        return FALSE;
    }

    pConfigData->strLocalDsp = chBuffer;

    if(!doc.GetTextWithAttributeName(pNode, "local_sync_dsp", chBuffer, 1024))
    {
        return FALSE;
    }

    pConfigData->strLocalSyncDsp = chBuffer;

    // Bug Trap
    pNode = doc.SelectSingleNode("/config_options/BUGTRAP");
    if(doc.GetTextWithAttributeName(pNode, "ip", chBuffer, 1024))
    {
        pConfigData->strBugTrapServerIP = chBuffer;
    }

    if(doc.GetTextWithAttributeName(pNode, "port", chBuffer, 1024))
    {
        pConfigData->dwBugTrapServerPort = atoi(chBuffer);        
    }

    pNode->Release(); 

    return TRUE;
}

BOOL CNtlScriptEncrypter::LoadConfigOptionENC( OUT SConfigData* pConfigData, char* szFileName ) 
{
    USES_CONVERSION;

    CNtlFileSerializer nsl(1024 * 1024, 1024 * 1024);

    WCHAR* wszFileName;
    WCHAR* wszCryptPassword;

    mbstowcs(wszFileName, szFileName, sizeof(szFileName));
    mbstowcs(wszCryptPassword, CRYPT_PASSWORD, sizeof(CRYPT_PASSWORD));

    if (!nsl.LoadFile(wszFileName, TRUE, wszCryptPassword))
        return FALSE;

    std::string strAddr = "";
    std::string strLocalDsp = "";
    std::string strLocalSyncDsp = "";
    std::string strBugTrapServerIP ="";

    nsl>>strAddr;
    nsl>>pConfigData->dwPort;
    nsl>>strLocalDsp;
    nsl>>strLocalSyncDsp;
    nsl>>strBugTrapServerIP;
    nsl>>pConfigData->dwBugTrapServerPort;

    pConfigData->strAddr = A2W(strAddr.c_str());
    pConfigData->strLocalDsp = A2W(strLocalDsp.c_str());
    pConfigData->strLocalSyncDsp = A2W(strLocalSyncDsp.c_str());
    pConfigData->strBugTrapServerIP = A2W(strBugTrapServerIP.c_str());

    return TRUE;
}

BOOL CNtlScriptEncrypter::SaveConfigOption(SConfigData* pConfigData, char* szFileName, BOOL bEncrypt /* = FALSE */)
{
    if(!pConfigData || !szFileName)
        return FALSE;

    if(bEncrypt)
    {
        return SaveConfigOptionENC(pConfigData, szFileName, CRYPT_PASSWORD);
    }
    else
    {
        return SaveConfigOptionXML(pConfigData, szFileName);
    }    
}

BOOL CNtlScriptEncrypter::SaveConfigOptionXML( SConfigData* pConfigData, char* szFileName ) 
{
    USES_CONVERSION;

    CNtlXMLDoc doc;
    doc.Create();

    IXMLDOMProcessingInstruction* pPI    = NULL;        

    doc.GetDocument()->createProcessingInstruction(L"xml", L"version=\"1.0\" encoding = \"UTF-8\"", &pPI);
    if(!pPI)
        return FALSE;
    doc.GetDocument()->appendChild(pPI, NULL);

    IXMLDOMElement*     pElemRoot = NULL;                ///< Root Element
    IXMLDOMElement*     pElemOp = NULL;
    IXMLDOMElement*     pElemLocal = NULL;
    IXMLDOMElement*     pElemBUGTrap = NULL;

    doc.GetDocument()->createElement(L"config_options", &pElemRoot);
    doc.GetDocument()->appendChild(pElemRoot, NULL);

    WCHAR wbuf[1204] = {0,};

    doc.GetDocument()->createElement(L"op", &pElemOp);
    pElemOp->setAttribute(L"ver", (_variant_t)L"0.1");
    pElemOp->setAttribute(L"ip", (_variant_t)pConfigData->strAddr);
    swprintf_s(wbuf, L"%d", pConfigData->dwPort);
    pElemOp->setAttribute(L"port", (_variant_t)wbuf);    

    doc.GetDocument()->createElement(L"local", &pElemLocal);
    pElemLocal->setAttribute(L"ver", (_variant_t)L"0.1");
    pElemLocal->setAttribute(L"local_dsp", (_variant_t)pConfigData->strLocalDsp);
    pElemLocal->setAttribute(L"local_sync_dsp", (_variant_t)pConfigData->strLocalSyncDsp);    

    doc.GetDocument()->createElement(L"BUGTRAP", &pElemBUGTrap);
    pElemBUGTrap->setAttribute(L"ip", (_variant_t)pConfigData->strBugTrapServerIP);
    swprintf_s(wbuf, L"%d", pConfigData->dwBugTrapServerPort);
    pElemBUGTrap->setAttribute(L"port", (_variant_t)wbuf);

    pElemRoot->appendChild(pElemOp, NULL);
    pElemRoot->appendChild(pElemLocal, NULL);
    pElemRoot->appendChild(pElemBUGTrap, NULL);

    doc.SetIndent(L"indent.xsl");
    HRESULT hr = doc.GetDocument()->save((_variant_t)szFileName);
    if(hr != S_OK)
        return FALSE;

    return TRUE;
}

BOOL CNtlScriptEncrypter::SaveConfigOptionENC( SConfigData* pConfigData, char* szFileName, char* szCryptPassword ) 
{
    USES_CONVERSION;

    CNtlFileSerializer nsl(1024 * 1024, 1024 * 1024);

    std::string strAddr = W2A(pConfigData->strAddr);
    std::string strLocalDsp = W2A(pConfigData->strLocalDsp);
    std::string strLocalSyncDsp = W2A(pConfigData->strLocalSyncDsp);
    std::string strBugTrapServerIP = W2A(pConfigData->strBugTrapServerIP);

    nsl<<strAddr;
    nsl<<pConfigData->dwPort;
    nsl<<strLocalDsp;
    nsl<<strLocalSyncDsp;
    nsl<<strBugTrapServerIP;
    nsl<<pConfigData->dwBugTrapServerPort;

    return nsl.SaveFile(szFileName, TRUE, szCryptPassword);

    return TRUE;
}

NtlScriptEncrypter.h

class CNtlScriptEncrypter
{
public:
    CNtlScriptEncrypter(void);
    ~CNtlScriptEncrypter(void);

    static BOOL LoadConfigOption(OUT SConfigData* pConfigData, char* szFileName);             
    static BOOL SaveConfigOption(SConfigData* pConfigData, char* szFileName, BOOL bEncrypt = FALSE); 

protected:
    static BOOL LoadConfigOptionXML(OUT SConfigData* pConfigData, char* szFileName);
    static BOOL LoadConfigOptionENC(OUT SConfigData* pConfigData, char* szFileName);
    static BOOL SaveConfigOptionXML(SConfigData* pConfigData, char* szFileName);
    static BOOL SaveConfigOptionENC(SConfigData* pConfigData, char* szFileName, char* szCryptPassword);
}; 

NtlXMLDoc.cpp


#include "StdAfx.h"
#include <comdef.h>
#include <atlbase.h>
#include "NtlXMLDoc.h"
//#include "NtlAssert.h"


class CCoInit
{
public:
    CCoInit( void )
    {
        ::CoInitialize( NULL );
    }

    ~CCoInit( void )
    {
        ::CoUninitialize();
    }
};

CCoInit g_CoInit;

CNtlXMLDoc::CNtlXMLDoc(void)
{
    Init();
}

CNtlXMLDoc::~CNtlXMLDoc(void)
{
    Destroy();
}

bool CNtlXMLDoc::Create()
{
    if (NULL != m_pXMLDocument)
        return false;

    HRESULT hResult;

    hResult = ::CoCreateInstance(__uuidof(DOMDocument30), NULL, CLSCTX_INPROC_SERVER, __uuidof(IXMLDOMDocument), (void**)&m_pXMLDocument);
    if (FAILED(hResult))
    {
        ::CoInitialize( NULL );
        hResult = ::CoCreateInstance(__uuidof(DOMDocument30), NULL, CLSCTX_INPROC_SERVER, __uuidof(IXMLDOMDocument), (void**)&m_pXMLDocument);
        if (FAILED(hResult))
        {
            Destroy();
            return false;
        }
    }

    if (NULL == m_pXMLDocument)
    {
        Destroy();
        return false;
    }

    hResult = m_pXMLDocument->put_async(VARIANT_FALSE);
    if (FAILED(hResult))
    {
        Destroy();
        return false;
    }

    hResult = m_pXMLDocument->put_validateOnParse(VARIANT_FALSE);
    if (FAILED(hResult))
    {
        Destroy();
        return false;
    }

    hResult = m_pXMLDocument->put_resolveExternals(VARIANT_FALSE);
    if (FAILED(hResult))
    {
        Destroy();
        return false;
    }

    return true;
}

bool CNtlXMLDoc::Destroy()
{
    if (NULL != m_pXMLDocument)
    {
        m_pXMLDocument->Release();
        m_pXMLDocument = NULL;
    }

    m_bIsFileLoaded = false;

    return true;
}

void CNtlXMLDoc::Init()
{
    m_pXMLDocument = NULL;
    m_bIsFileLoaded = false;
}
bool CNtlXMLDoc::Load(WCHAR* pwszFileName, LONG* lLineNumber, BSTR* bstrErrorReasonString )
{
    if (false != m_bIsFileLoaded)
        return false;

    VARIANT_BOOL status = VARIANT_FALSE;
    HRESULT hResult = m_pXMLDocument->load((_variant_t)pwszFileName, &status);
    if (FAILED(hResult))
    {
        return false;
    }

    if (VARIANT_FALSE == status)
    {
        IXMLDOMParseError* pXMLError = NULL;
        m_pXMLDocument->get_parseError(&pXMLError);

        //BSTR bstrErrorReasonString;
        //LONG lLineNumber = 0;
        BSTR bstrSrcText;
        LONG lLinePosition = 0;

        pXMLError->get_srcText(&bstrSrcText);
        pXMLError->get_reason(bstrErrorReasonString);
        pXMLError->get_line(lLineNumber);
        pXMLError->get_linepos(&lLinePosition);

        //::SysFreeString(*bstrErrorReasonString);

        pXMLError->Release();

        return false;
    }

    m_bIsFileLoaded = true;

    return true;
}

bool CNtlXMLDoc::Load(WCHAR* pwszFileName )
{
    if (false != m_bIsFileLoaded)
        return false;

    VARIANT_BOOL status = VARIANT_FALSE;
    HRESULT hResult = m_pXMLDocument->load((_variant_t)pwszFileName, &status);
    if (FAILED(hResult))
    {
        return false;
    }

    if (VARIANT_FALSE == status)
    {
        IXMLDOMParseError* pXMLError = NULL;
        m_pXMLDocument->get_parseError(&pXMLError);

        BSTR bstrErrorReasonString;
        LONG lLineNumber = 0;
        BSTR bstrSrcText;
        LONG lLinePosition = 0;

        pXMLError->get_srcText(&bstrSrcText);
        pXMLError->get_reason(&bstrErrorReasonString);
        pXMLError->get_line(&lLineNumber);
        pXMLError->get_linepos(&lLinePosition);

        ::SysFreeString(bstrErrorReasonString);

        pXMLError->Release();

        return false;
    }

    m_bIsFileLoaded = true;

    return true;
}

bool CNtlXMLDoc::Load(char* pszFileName)
{
    if (false != m_bIsFileLoaded)
        return false;

    WCHAR wszUnicodeFileName[MAX_UNICODE_FILE_NAME_LENGTH   1];
    ZeroMemory(wszUnicodeFileName, sizeof(WCHAR) * (MAX_UNICODE_FILE_NAME_LENGTH   1));

    int iWrittenChars = ::MultiByteToWideChar(GetACP(), 0, pszFileName, -1, wszUnicodeFileName, MAX_UNICODE_FILE_NAME_LENGTH);
    wszUnicodeFileName[MAX_UNICODE_FILE_NAME_LENGTH] = L'\0';

    if (0 == iWrittenChars)
        return false;

    return Load(wszUnicodeFileName);
}

bool CNtlXMLDoc::LoadXML( char* szXMLBuffer ) 
{
    USES_CONVERSION;

    if(false != m_bIsFileLoaded)
        return false;

    return LoadXML(A2W(szXMLBuffer));
}

bool CNtlXMLDoc::LoadXML( WCHAR* wszXMLBuffer ) 
{
    if (false != m_bIsFileLoaded)
        return false;

    VARIANT_BOOL status;    
    HRESULT hResult = m_pXMLDocument->loadXML(wszXMLBuffer, &status);

    if (FAILED(hResult))
    {
        return false;
    }

    if (VARIANT_FALSE == status)
    {
        IXMLDOMParseError* pXMLError = NULL;
        m_pXMLDocument->get_parseError(&pXMLError);

        BSTR bstrErrorReasonString;
        pXMLError->get_reason(&bstrErrorReasonString);
        ::SysFreeString(bstrErrorReasonString);

        pXMLError->Release();

        return false;
    }

    m_bIsFileLoaded = true;

    return true;
}


IXMLDOMNode* CNtlXMLDoc::SelectSingleNode(WCHAR* pwszXPath)
{
    if (false == m_bIsFileLoaded)
        return NULL;
    if (NULL == pwszXPath)
        return NULL;

    IXMLDOMNode* pXMLNode = NULL;

    BSTR bstrXPath = ::SysAllocString(pwszXPath);
    HRESULT hResult = m_pXMLDocument->selectSingleNode(bstrXPath, &pXMLNode);
    if (FAILED(hResult))
    {
        ::SysFreeString(bstrXPath);
        return NULL;
    }

    ::SysFreeString(bstrXPath);
    return pXMLNode;
}

IXMLDOMNode* CNtlXMLDoc::SelectSingleNode(char* pszXPath)
{
    if (false == m_bIsFileLoaded)
        return NULL;

    WCHAR wszUnicodeXPath[MAX_UNICODE_XPATH_LENGTH   1];
    ZeroMemory(wszUnicodeXPath, sizeof(WCHAR) * (MAX_UNICODE_XPATH_LENGTH   1));

    int iWrittenChars = ::MultiByteToWideChar(GetACP(), 0, pszXPath, -1, wszUnicodeXPath, MAX_UNICODE_XPATH_LENGTH);
    wszUnicodeXPath[MAX_UNICODE_XPATH_LENGTH] = L'\0';

    if (0 == iWrittenChars)
        return NULL;

    return SelectSingleNode(wszUnicodeXPath);
}

IXMLDOMNodeList* CNtlXMLDoc::SelectNodeList(WCHAR* pwszXPath)
{
    if (false == m_bIsFileLoaded)
        return NULL;
    if (NULL == pwszXPath)
        return NULL;

    IXMLDOMNodeList* pXMLNodeList = NULL;

    BSTR bstrXPath = ::SysAllocString(pwszXPath);
    HRESULT hResult = m_pXMLDocument->selectNodes(bstrXPath, &pXMLNodeList);
    if (FAILED(hResult))
    {
        ::SysFreeString(bstrXPath);
        return NULL;
    }

    ::SysFreeString(bstrXPath);
    return pXMLNodeList;
}

IXMLDOMNodeList* CNtlXMLDoc::SelectNodeList(char* pszXPath)
{
    if (false == m_bIsFileLoaded)
        return NULL;

    WCHAR wszUnicodeXPath[MAX_UNICODE_XPATH_LENGTH   1];
    ZeroMemory(wszUnicodeXPath, sizeof(WCHAR) * (MAX_UNICODE_XPATH_LENGTH   1));

    int iWrittenChars = ::MultiByteToWideChar(GetACP(), 0, pszXPath, -1, wszUnicodeXPath, MAX_UNICODE_XPATH_LENGTH);
    wszUnicodeXPath[MAX_UNICODE_XPATH_LENGTH] = L'\0';

    if (0 == iWrittenChars)
        return NULL;

    return SelectNodeList(wszUnicodeXPath);
}

bool CNtlXMLDoc::GetTextWithAttributeName(IXMLDOMNode* pNode, WCHAR* pwszAttributeName, WCHAR* pwszResultText, int nBufferSizeInWChars)
{
    if (NULL == pNode || NULL == pwszAttributeName || NULL == pwszResultText)
    {
        //      NtlAssertFail("NULL == pNode || NULL == pwszAttributeName || NULL == pwszResultText");
        return false;
    }
    if (0 >= nBufferSizeInWChars)
    {
        //      NtlAssertFail("0 >= nBufferSizeInWChars");
        return false;
    }

    IXMLDOMNamedNodeMap* pMap = NULL;
    pNode->get_attributes(&pMap);
    if (NULL == pMap)
    {
        //      NtlAssertFail("Couldn't get the attribute list from the given IXMLDOMNode.");
        return false;
    }

    IXMLDOMNode* pVirtualNode = NULL;
    pMap->getNamedItem(pwszAttributeName, &pVirtualNode);
    if (NULL == pVirtualNode)
    {
        //      NtlAssertFail("Couldn't find the given attribute name.");
        return false;
    }

    VARIANT var;
    VariantInit(&var);
    pVirtualNode->get_nodeValue(&var);

    if (wcslen(V_BSTR(&var)) >= (size_t)nBufferSizeInWChars)
    {
        //      NtlAssertFail("The buffer size is not enough to take the whole attribute value.");
        return false;
    }

    wcscpy_s(pwszResultText, nBufferSizeInWChars, V_BSTR(&var));

    return true;
}

bool CNtlXMLDoc::GetTextWithAttributeName(IXMLDOMNode* pNode, char* pszAttributeName, char* pszResultText, int nBufferSizeInBytes)
{
    if (NULL == pNode || NULL == pszAttributeName || NULL == pszResultText)
    {
        //      NtlAssertFail("NULL == pNode || NULL == pszAttributeName || NULL == pszResultText");
        return false;
    }
    if (0 >= nBufferSizeInBytes)
    {
        //      NtlAssertFail("0 >= nBufferSizeInBytes");
        return false;
    }

    int nRequiredBytes = 0;
    nRequiredBytes = MultiByteToWideChar(GetACP(), 0, pszAttributeName, -1, NULL, 0);
    if (0 == nRequiredBytes)
    {
        //      NtlAssertFail("The given attribute name can't be converted into WCHAR type for some reason.");
        return false;
    }
    if (nRequiredBytes > (CNtlXMLDoc::MAX_ATTRIBUTE_NAME_IN_WCHAR   1))
    {
        //      NtlAssertFail("The given attribute name is too long.");
        return false;
    }

    WCHAR pwszAttributeNameInWChar[CNtlXMLDoc::MAX_ATTRIBUTE_NAME_IN_WCHAR   1];

    int nUsedBufferSize = MultiByteToWideChar(GetACP(), 0, pszAttributeName, -1, pwszAttributeNameInWChar, (CNtlXMLDoc::MAX_ATTRIBUTE_NAME_IN_WCHAR   1));
    if (0 == nUsedBufferSize)
    {
        //      NtlAssertFail("The given attribute name couldn't be converted into WCHAR type for some reason.");
        return false;
    }

    IXMLDOMNamedNodeMap* pMap = NULL;
    pNode->get_attributes(&pMap);
    if (NULL == pMap)
    {
        //      NtlAssertFail("Couldn't get the attribute list from the given IXMLDOMNode.");
        return false;
    }

    IXMLDOMNode* pVirtualNode = NULL;
    pMap->getNamedItem(pwszAttributeNameInWChar, &pVirtualNode);
    if (NULL == pVirtualNode)
    {
        //      NtlAssertFail("Couldn't find the given attribute name.");
        return false;
    }

    VARIANT var;
    VariantInit(&var);
    pVirtualNode->get_nodeValue(&var);

    nRequiredBytes = WideCharToMultiByte(::GetACP(), 0, V_BSTR(&var), -1, pszResultText, 0, NULL, NULL);
    if (nRequiredBytes > nBufferSizeInBytes)
    {
        //      NtlAssertFail("The buffer size is not enough to take the whole attribute value.");
        return false;
    }

    WideCharToMultiByte(GetACP(), 0, V_BSTR(&var), -1, pszResultText, nBufferSizeInBytes, NULL, NULL);
    return true;
}

bool CNtlXMLDoc::GetDataWithXPath(WCHAR* pwszXPath, WCHAR* pwszResultData, int nBufferSizeInWChars)
{
    if (NULL == pwszXPath || NULL == pwszResultData || 0 >= nBufferSizeInWChars)
        return false;

    IXMLDOMNode* pNode = NULL;    
    m_pXMLDocument->selectSingleNode(pwszXPath, &pNode);

    if(!pNode)
        return false;

    BSTR bstr = NULL;
    if (FAILED(pNode->get_text(&bstr)))
    {
        ::SysFreeString(bstr);
        pNode->Release();           
        return false;
    }

    wcscpy_s(pwszResultData, nBufferSizeInWChars, bstr);

    ::SysFreeString(bstr);
    pNode->Release();

    return true;
}

bool CNtlXMLDoc::GetDataWithXPath(char* pszXPath, char* pszResultData, int nBufferSizeInBytes)
{
    if (NULL == pszXPath || NULL == pszResultData || 0 >= nBufferSizeInBytes)
        return false;

    WCHAR wszUnicodeXPath[1024   1];

    int iRequiredChars = ::MultiByteToWideChar(GetACP(), 0, pszXPath, -1, NULL, 0);
    if (_countof(wszUnicodeXPath) < iRequiredChars)
        return false;

    int iWrittenChars = ::MultiByteToWideChar(GetACP(), 0, pszXPath, -1, wszUnicodeXPath, _countof(wszUnicodeXPath));
    if (0 == iWrittenChars)
        return false;
    wszUnicodeXPath[_countof(wszUnicodeXPath) - 1] = L'\0';

    WCHAR wszUnicodeResultData[1024   1];
    if (false == GetDataWithXPath(wszUnicodeXPath, wszUnicodeResultData, _countof(wszUnicodeResultData)))
        return false;

    iRequiredChars = ::WideCharToMultiByte(GetACP(), 0, wszUnicodeResultData, -1, NULL, 0, NULL, NULL);
    if (nBufferSizeInBytes < iRequiredChars)
        return false;

    iWrittenChars = ::WideCharToMultiByte(GetACP(), 0, wszUnicodeResultData, -1, pszResultData, nBufferSizeInBytes, NULL, NULL);
    if (0 == iWrittenChars)
        return false;
    pszResultData[nBufferSizeInBytes - 1] = '\0';

    return true;
}

/**
* XML ??à?à? ?ü???| Tabà? àì?????- o?±a áá°? ᤷ???′ù.
* \param szIndentFileName ᤷ??? ?????ò ?o??à? ???? ??à??í
* return ?o°? àˉ1?
*/
bool CNtlXMLDoc::SetIndent(WCHAR* szIndentFileName)
{
    IXMLDOMDocument* pXSL = NULL;
    CoCreateInstance(__uuidof(DOMDocument30), NULL, CLSCTX_INPROC_SERVER, __uuidof(IXMLDOMDocument), (void**)&pXSL);
    if(!pXSL)
        return false;

    VARIANT_BOOL vBool;
    pXSL->put_async(VARIANT_FALSE);
    pXSL->load((_variant_t)szIndentFileName, &vBool);

    VARIANT vObject;
    VariantInit(&vObject);
    vObject.vt = VT_DISPATCH;
    vObject.pdispVal = m_pXMLDocument;

    m_pXMLDocument->transformNodeToObject(pXSL, vObject);

    if(pXSL)
    {
        pXSL->Release();
        pXSL = NULL;
    }

    return true;
}

IXMLDOMDocument* CNtlXMLDoc::GetDocument(void)
{
    return m_pXMLDocument;
} 

控制臺向我顯示的一些錯誤:


 LNK2019    símbolo externo "public: bool __thiscall CNtlXMLDoc::GetTextWithAttributeName(struct IXMLDOMNode *,char *,char *,int)" (?GetTextWithAttributeName@CNtlXMLDoc@@QAE_NPAUIXMLDOMNode@@PAD1H@Z) sin resolver al que se hace referencia en la función "protected: static int __cdecl CNtlScriptEncrypter::LoadConfigOptionXML(struct _SConfigData *,char *)" (?LoadConfigOptionXML@CNtlScriptEncrypter@@KAHPAU_SConfigData@@PAD@Z)

我正在使用 MFC 和 VC Compiler 2010 在 VS 2019 中編譯它。我想我鏈接了專案屬性中的所有庫和頭檔案。

我有大約 23 個錯誤,幾乎與上述錯誤相同,都在同一個 obj 檔案中并參考 NtlXMLDoc 函式。

如果你能給我一些建議,那就太好了。謝謝!

該專案不是我創建的,它是前一段時間發布的代碼,我正在嘗試修復它

uj5u.com熱心網友回復:

解決方案是:將包含 NtlXMLDoc.cpp 的專案添加到我在專案資源管理器中的參考中,因為它們在同一個解決方案中,但是是不同的專案,并且知道為什么通過屬性不起作用

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/417834.html

標籤:

上一篇:無法從下拉串列選定值將值傳遞給SQLWHERE子句

下一篇:使MicrosoftVisualStudio代碼除錯控制臺干凈

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more