我想在com控件中做一个接口,用于返回一个xml的文档对象,
但是在IDL文件中变量IXMLDOMDocument通不过,
所以我想把xml文档转化为BSTR型去返回,
但是不知道BSTR类型到底能返回多长的一个字符串?
如果我的xml文件很大怎么办?

解决方案 »

  1.   

    用IStream传内存句柄就可以了,参数类型可以用IUnknown
      

  2.   

    但是在IDL文件中变量IXMLDOMDocument通不过???什么错误?
      

  3.   

    是NameSpace错了吧,默认要加MSXML2::来访问
      

  4.   

    “至多只能返回127个字符的
    我上次就是因为用了这个类型出错的”胡扯!BSTR可以传递非常大的2进制数据,当然也包括字符串,前提是你正确理解并操作BSTR的话。至于到底有多大,俺没有确认过,但俺认为是4个字节所能表示的最大数
    当然,实际使用中肯定要受到系统资源的限制
      

  5.   

    "是NameSpace错了吧,默认要加MSXML2::来访问"
    IDL文件里也能用namespace?开玩笑吧?你应该先导入MSXML的idl文件。
      

  6.   

    Analyst() :MSXML的idl文件到哪里去找呀?
    是不是包含了它就可以把返回参数设为:[out,retval]IXMLDOMDocumentPtr pDoc?BSTR是可以保存4个字节的最大数,但是XML到BSTR,调用的时候又要BSTR到XML,比较麻烦,最好是COM能直接返回一个xml文件。jiangsheng(蒋晟.Net):“用IStream传内存句柄就可以了,参数类型可以用IUnknown。”
                           具体该怎么做呢?能否详细点?谢谢。
    我是通过
          IXMLHTTPRequestPtr pIXMLHTTPRequest;
          pIXMLHTTPRequest->responseXML;
    得到一个xml文件的。
      

  7.   

    see COleStream in MFC reference
      

  8.   

    #import "msxml.idl"
    or
    #import "msxml2.idl"
      

  9.   

    但是我包含了:import "msxml.idl";
    当定义[out,retval]IXMLDOMDocument *pDoc,或IXMLDOMDocumentPtr pDoc,时,
    还是出错:
    error MIDL2025 : syntax error : expecting a type specification near "IXMLDOMDocument"请问有没有好的方法?谢谢了。
      

  10.   

    理论上BSTR应该是可以传2的64次方的数据具体多少自己去算
    我曾经尝试过10M的
      

  11.   

    嗯,我知道了,
    但是我希望最好还是直接通过pIXMLHTTPRequest->responseXML的返回值去传递,
    省了来回转化,不知道有没有人做过类似的工作?
      

  12.   

    找不到IXMLDOMDocument的话,加一句申明 interface IXMLDOMDocument;
    返回对象应该定义成 [out,retval]IXMLDOMDocument** ppDoc
    或者最苯的定义成 [out,retval]IUnknown** ppDoc
    得到xml对象后再QueryInterface
      

  13.   

    我在idl文件已经包含了:
    import "msxml.idl";
    interface IXMLDOMDocument;
    接口定义为:
    [id(1), helpstring("method Test")] HRESULT Test([out,retval]IXMLDOMDocument** ppDoc);
    但是还是出错:
    unresolved type declaration : IXMLDOMDocument [ Parameter 'ppDoc' of Procedure 'Test' ( Interface 'INappAddress' ) ]
    请问这是为什么?谢谢
      

  14.   

    原来我发现在C:\Program Files\Microsoft Visual Studio\VC98\Include
    下的msxml.idl文件中根本没有IXMLDOMDocument的定义,
    不知道谁有这个idl文件,给我传一个,谢谢!
      

  15.   

    是不是IXMLDocument接口啊?
    参见:
    MSDN 之 Microsoft XML 3.0 - XML Reference:
    ---------------------------
    ◎ Example
    The following C/C++ example creates DOMDocument and queries for the other interfaces.HRESULT hr;
    IXMLDOMDocument * pXMLDoc;
    IXMLDOMNode * pXDN;
    //...
    hr = CoInitialize(NULL); 
    // Check the return value, hr...
    hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, 
           IID_IXMLDOMDocument, (void**)&pXMLDoc);
    // Check the return value, hr...
    hr = pXMLDoc->QueryInterface(IID_IXMLDOMNode, (void **)&pXDN);
    // Check the return value.◎ Requirements
    Implementation: msxml3.dll, msxml2.lib[C/C++] 
    Header and IDL files: msxml2.h, msxml2.idl
    --------------------------------------
    也就是说你要升级到3.0版才会有!按照楼主的想法,只要使用COM里面的包容模型,用自己的COM对象对MSXML 3.0 里面的DOMDocument 对象简单的封装一下就可以了。不知道我说得对不对?
      

  16.   

    实在不行定义成[out,retval]IUnknown** ppDoc 总应该可以了,得到对象后再QueryInterface
      

  17.   

    我现在的xml是3.0版的,它只有msxml.idl,
    IXMLDocument是通不过的,
    我是在com中已经得到了一个xml文档,希望直接把这个文档对象传递出去,
    在客户端直接调用接口得到一个IXMLDOMDocument的对象。十分急,不管我怎么在idl文件中加头文件,就是不让定义IXMLDOMDocument** ppDoc
      

  18.   

    Analyst() :
         “实在不行定义成[out,retval]IUnknown** ppDoc 总应该可以了,得到对象后再QueryInterface”请问是怎么用IUnknown** ppDoc 接收XMLDOMDocument的值?
      

  19.   

    楼上说的很对:
    “实在不行定义成[out,retval]IUnknown** ppDoc 总应该可以了,得到对象后再QueryInterface”服务器端:
    把你的 IXMLDOMDocument 指针,调用QueryInterface得到IUnknown传递出去
    客户端:
    得到IUnknown,调用QueryInterface或类型的方法,得到IXMLDOMDocument 也可以用IDispatch类型传递
      

  20.   

    zzyx(菜农):
    “服务器端:
    把你的 IXMLDOMDocument 指针,调用QueryInterface得到IUnknown传递出去
    客户端:
    得到IUnknown,调用QueryInterface或类型的方法,得到IXMLDOMDocument ”真不好意思,不太会用这几个函数哦....能不能给个例子?谢谢了
      

  21.   

    如果没有,你改用 "msxml2.idl"
      

  22.   

    定义成IUnknown
    然后:
    CComPtr<IUnknown> pObj;
    CComQIPtr<IXMLDOMDocument> pDoc;
    Test(&pObj);
    pDoc = pObj;虽然多了一次QueryInterface,但总算是解决了问题。
      

  23.   

    arxing(阿行):
    我检查了下msxml.idl,发现确实没有IXMLDOMDocument的定义,
    于是我下载了xmlsdk3.0,然后按照你说的,改为了:"msxml2.idl"
    但是却出现13个错误:
    msxml2.idl
    C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\msxml2.idl(49) : error MIDL2003 : redefinition : _xml_error
    C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\msxml2.idl(49) : error MIDL2003 : redefinition : XML_ERROR
    C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\msxml2.idl(151) : error MIDL2003 : redefinition : XMLELEMTYPE_ELEMENT
    C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\msxml2.idl(152) : error MIDL2003 : redefinition : XMLELEMTYPE_TEXT
    C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\msxml2.idl(153) : error MIDL2003 : redefinition : XMLELEMTYPE_COMMENT
    C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\msxml2.idl(154) : error MIDL2003 : redefinition : XMLELEMTYPE_DOCUMENT
    C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\msxml2.idl(155) : error MIDL2003 : redefinition : XMLELEMTYPE_DTD
    C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\msxml2.idl(156) : error MIDL2003 : redefinition : XMLELEMTYPE_PI
    C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\msxml2.idl(158) : error MIDL2003 : redefinition : XMLELEMTYPE_OTHER
    C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\msxml2.idl(2680) : error MIDL2003 : redefinition : IXMLDocument
    C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\msxml2.idl(2734) : error MIDL2003 : redefinition : IXMLElement
    C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\msxml2.idl(2800) : error MIDL2003 : redefinition : IXMLError
    C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\msxml2.idl(3133) : error MIDL2003 : redefinition : XMLDocument这是怎么回事呀?我在vb里包含msxml3.0是可以通过的。