2013-03-05 37 views
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; 
} 
+0

你能標記出你得到錯誤的行。在使用它之前,你還沒有檢查'pIBidiSpl2'的有效性(是'!= NULL')。我懷疑這是獲得這種例外的最可能原因。 – 2013-03-05 17:36:43

+0

我在上面的代碼中添加了錯誤,我還在一個快速if語句中添加了以確保pIBiDiSpl2不爲null並仍然出現錯誤。感謝您的幫助,我希望:) – user2136748 2013-03-05 17:45:33

+0

我想你的意思是你的快速檢查失敗後的stmt:'pIBidiSpl2-> SendRecvXMLString(test1,&responce);'。對不起,1日看起來一切都很好(根據'SendRecvXMLString'的參數說明)。看起來像'bidispl.dll'模塊中發生的錯誤,可能是由於'Test1'變量的意外或無效輸入引起的。您是否檢查了所傳遞的XML與所提到的模式? – 2013-03-05 18:32:31

回答

0

嘗試改變

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

hr = CoCreateInstance(CLSID_BidiSpl, 
     NULL, 
     CLSCTX_INPROC_SERVER, 
     **IID_IBidiSpl2,** 
     (void**)&pIBidiSpl2) ; 
相關問題