Я пытаюсь использовать функцию 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;
}
вы могли бы выделить строку, где вы получаете сообщение об ошибке , Также вы не проверяете 'pIBidiSpl2' на достоверность (будучи'! = NULL') перед его использованием. Я подозреваю, что это самая вероятная причина получения такого исключения. –
Я добавил, где я получу ошибку для кода выше. Я также добавил в операторе if, чтобы убедиться, что pIBiDiSpl2 не был нулевым и все еще получил ошибку. Спасибо за помощь, на которую я надеялся :) – user2136748
Я предполагаю, что вы имеете в виду stmt после неудачной проверки: 'pIBidiSpl2-> SendRecvXMLString (test1, & responce);'. Извините за первый взгляд, все читается просто отлично (в соответствии с параметром 'SendRecvXMLString'). Похоже, что ошибка, возникающая внутри модуля 'bidispl.dll', может быть вызвана неожиданным или недопустимым вводом из переменной' Test1'. Вы проверили XML-код, который вы проходите против указанной схемы? –