1
我正在嘗試使用IBidispl2->SendRecvXML
函數,並且我不斷收到未處理的異常錯誤。當我打電話給pIBidiSpl2 :: SendRecvXMLString時發生錯誤
我是第一個承認我在C++方面非常薄弱的人,但我知道如何閱讀並試圖找到對IBiDiSpl2函數的例子或更好的解釋,並且已經走到死衚衕。 0000005:訪問衝突讀取位置0xCCCCCCD0
當我嘗試在0x69D82C10(bidispl.dll)在V4BiDiTest.exe調試這個
未處理的異常,我得到這個錯誤。
這裏是我一起工作的代碼:
#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')。我懷疑這是獲得這種例外的最可能原因。 – 2013-03-05 17:36:43
我在上面的代碼中添加了錯誤,我還在一個快速if語句中添加了以確保pIBiDiSpl2不爲null並仍然出現錯誤。感謝您的幫助,我希望:) – user2136748 2013-03-05 17:45:33
我想你的意思是你的快速檢查失敗後的stmt:'pIBidiSpl2-> SendRecvXMLString(test1,&responce);'。對不起,1日看起來一切都很好(根據'SendRecvXMLString'的參數說明)。看起來像'bidispl.dll'模塊中發生的錯誤,可能是由於'Test1'變量的意外或無效輸入引起的。您是否檢查了所傳遞的XML與所提到的模式? – 2013-03-05 18:32:31