2013-03-05 2 views
1

Я пытаюсь использовать функцию IBidispl2->SendRecvXML, и я продолжаю получать необработанную ошибку исключения.Получение ошибки при вызове pIBidiSpl2 :: SendRecvXMLString

Я первый, кто признал, что я очень слаб в C++, но я знаю, как читать и пытаюсь найти примеры или более подробные объяснения функций IBiDiSpl2 и зашел в тупик.

Я получаю эту ошибку, когда я пытаюсь отлаживать этот

Необработанное исключение при 0x69D82C10 (bidispl.dll) в V4BiDiTest.exe: 0xC0000005: Access место чтения нарушение 0xCCCCCCD0.

Вот код, я работаю с:

#include "stdafx.h" 
#include "BiDiSpl.h" 
#include "comutil.h" 

#include <iostream> 
#include <vector> 
#include <comdef.h> 
#include <stdio.h> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    // verify atleast 3 args (prog.exe <printername> query1....) 
    if(argc < 3) 
    { 
     cout << "ERROR: invalid usage, not enough arguments"<< endl << 
      "USAGE: V4BiDiTest.exe <printername> \"query1\" [\"query2\"] ... "  << endl << 
      "Please rerun the application"; 
     return 1; 
    } 

    // set the first arg after the exe to the printer name 
    string printer = argv[1]; 
    std::wstring stemp = std::wstring(printer.begin(), printer.end()); 
    LPCWSTR pPrinter = stemp.c_str(); 

    HRESULT hr; 
    DWORD dwAccess; 
    IBidiSpl2 *pIBidiSpl2 = NULL; 
    dwAccess = BIDI_ACCESS_USER; 

    // build the request schema with all other args after argv[1] 
    char* getSch = "<bidi:Get  xmlns:bidi=\"http://schemas.microsoft.com/windows/2005/03/printing/bidi\">"; 
    _bstr_t bstrt(getSch); 

    for (int i = 2; i < argc; i++) 
    { 
     bstrt+="<Query schema=\'"; 
     char *argStr =argv[i]; 
     bstrt+=argStr; 
     bstrt+="\'/>"; 
    } 
    bstrt+="</bidi:Get>"; 

    hr = CoInitializeEx (NULL, COINIT_MULTITHREADED) ; 
    hr = CoCreateInstance(CLSID_BidiSpl, 
      NULL, 
      CLSCTX_INPROC_SERVER, 
      IID_IBidiSpl, 
      (void**)&pIBidiSpl2) ; 

    if (pIBidiSpl2 == NULL) 
    { 
     cerr << "CoCreateInstance failed" << endl; 
     return 1; 
    } 


    hr = pIBidiSpl2->BindDevice(pPrinter,dwAccess); 
    //Test hr here 
    if (hr!=0){ cout << "failed on bind" <<endl; return 1;} 

    BSTR responce; 
    BSTR test1 = ::SysAllocString(L"<bidi:Get xmlns:bidi=\"http://schemas.microsoft.com/windows/2005/03/printing/bidi\"><Query schema='\\Printer'/></bidi:Get>"); 

    // I get the error when the following line executes 
    hr = pIBidiSpl2->SendRecvXMLString(test1, &responce); 
    //Test hr here 
    if (hr!=0){cout << "failed on send" <<endl;return 1;} 
    cout << responce << endl; 
    ::SysFreeString(test1); 
    ::SysFreeString(responce); 

    hr = pIBidiSpl2->UnbindDevice(); 
    // test hr here 
    if (hr!=0){cout << "failed on unbind" <<endl;return 1;} 
    cout << "Successfully unbound device" << endl; 

    return 0; 
} 
+0

вы могли бы выделить строку, где вы получаете сообщение об ошибке , Также вы не проверяете 'pIBidiSpl2' на достоверность (будучи'! = NULL') перед его использованием. Я подозреваю, что это самая вероятная причина получения такого исключения. –

+0

Я добавил, где я получу ошибку для кода выше. Я также добавил в операторе if, чтобы убедиться, что pIBiDiSpl2 не был нулевым и все еще получил ошибку. Спасибо за помощь, на которую я надеялся :) – user2136748

+0

Я предполагаю, что вы имеете в виду stmt после неудачной проверки: 'pIBidiSpl2-> SendRecvXMLString (test1, & responce);'. Извините за первый взгляд, все читается просто отлично (в соответствии с параметром 'SendRecvXMLString'). Похоже, что ошибка, возникающая внутри модуля 'bidispl.dll', может быть вызвана неожиданным или недопустимым вводом из переменной' Test1'. Вы проверили XML-код, который вы проходите против указанной схемы? –

ответ

0

Try Изменение

hr = CoCreateInstance(CLSID_BidiSpl, 
     NULL, 
     CLSCTX_INPROC_SERVER, 
     **IID_IBidiSpl,** 
     (void**)&pIBidiSpl2) ; 

в

hr = CoCreateInstance(CLSID_BidiSpl, 
     NULL, 
     CLSCTX_INPROC_SERVER, 
     **IID_IBidiSpl2,** 
     (void**)&pIBidiSpl2) ; 
Смежные вопросы