Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用IStream接口访问剪贴板 #包括 #包括 #包括 #包括 // //所需输出:剪贴板中的文本应显示在屏幕上。 // 内部主(空) { // //OLE COM接口 // HRESULT-hr; //拿夹板 IDataObject*pcb=0; oleget剪贴板(和pcb); //获取剪贴板数据接口 格式ETC格式; format.cfFormat=CF_文本; format.ptd=NULL; format.dwAspect=DVASPECT\u内容; format.lindex=-1; format.tymed=tymed_ISTREAM; 基质培养基; hr=pcb->GetData(&format,&medium); 如果(失败(小时)) 返回人力资源; //获取返回的IStream的状态 IStream*pis=medium.pstm; STATSTG stat; 乌隆cb=0; hr=pis->Stat(&Stat,STATFLAG\u默认值); 如果(成功(hr)) { 如果(stat.pwcsName) STD:我不得不用COM和C++来表示哀悼。我已经接触了4年或5年了,但是看看你的东西,我猜两件事中的一个是问题:_C++_Windows_Com - Fatal编程技术网

使用IStream接口访问剪贴板 #包括 #包括 #包括 #包括 // //所需输出:剪贴板中的文本应显示在屏幕上。 // 内部主(空) { // //OLE COM接口 // HRESULT-hr; //拿夹板 IDataObject*pcb=0; oleget剪贴板(和pcb); //获取剪贴板数据接口 格式ETC格式; format.cfFormat=CF_文本; format.ptd=NULL; format.dwAspect=DVASPECT\u内容; format.lindex=-1; format.tymed=tymed_ISTREAM; 基质培养基; hr=pcb->GetData(&format,&medium); 如果(失败(小时)) 返回人力资源; //获取返回的IStream的状态 IStream*pis=medium.pstm; STATSTG stat; 乌隆cb=0; hr=pis->Stat(&Stat,STATFLAG\u默认值); 如果(成功(hr)) { 如果(stat.pwcsName) STD:我不得不用COM和C++来表示哀悼。我已经接触了4年或5年了,但是看看你的东西,我猜两件事中的一个是问题:

使用IStream接口访问剪贴板 #包括 #包括 #包括 #包括 // //所需输出:剪贴板中的文本应显示在屏幕上。 // 内部主(空) { // //OLE COM接口 // HRESULT-hr; //拿夹板 IDataObject*pcb=0; oleget剪贴板(和pcb); //获取剪贴板数据接口 格式ETC格式; format.cfFormat=CF_文本; format.ptd=NULL; format.dwAspect=DVASPECT\u内容; format.lindex=-1; format.tymed=tymed_ISTREAM; 基质培养基; hr=pcb->GetData(&format,&medium); 如果(失败(小时)) 返回人力资源; //获取返回的IStream的状态 IStream*pis=medium.pstm; STATSTG stat; 乌隆cb=0; hr=pis->Stat(&Stat,STATFLAG\u默认值); 如果(成功(hr)) { 如果(stat.pwcsName) STD:我不得不用COM和C++来表示哀悼。我已经接触了4年或5年了,但是看看你的东西,我猜两件事中的一个是问题:,c++,windows,com,C++,Windows,Com,IStream指针从数据的末尾开始。在这种情况下,您必须调用pis->Seek(0,STREAM\u Seek\u SET,NULL)以在开始时重置它。可能是调用pis->Read()返回S_FALSE而不是S_OK;如果流指针位于流的末尾,则会发生这种情况 剪贴板不支持使用IStream。事实上,我从未听说过这样做;我认为通常的方法是将剪贴板数据作为全局内存块进行访问。(请参阅比代码简单得多的方法)当你接触到令人讨厌的主题时,iStream是必要的,这是微软Office应用程序将分层数据存储在

IStream指针从数据的末尾开始。在这种情况下,您必须调用
pis->Seek(0,STREAM\u Seek\u SET,NULL)
以在开始时重置它。可能是调用
pis->Read()
返回
S_FALSE
而不是
S_OK
;如果流指针位于流的末尾,则会发生这种情况

  • 剪贴板不支持使用IStream。事实上,我从未听说过这样做;我认为通常的方法是将剪贴板数据作为全局内存块进行访问。(请参阅比代码简单得多的方法)当你接触到令人讨厌的主题时,iStream是必要的,这是微软Office应用程序将分层数据存储在一个文件中的老方法


  • 一个旁注:如果不必使用C++,并且熟悉其他具有Windows剪贴板访问绑定的语言(C),VB为“本地”.NET Access;java具有本地Windows特性的子集的便携式剪贴板访问,我认为Python也有。,您不必去处理那些难看的COM功能。

    p.s.您的调用在哪里?事实上,IStream指向了流的末尾。您是对的。我还注意到我没有调用CoInitialize,但Windows以某种方式运行它没有问题。顺便说一句,我将尝试您建议的方法。谢谢。
    #include <Windows.h>
    #include <iostream>
    #include <vector>
    #include <string>  
    //
    // Desired Output: Text in clipboard should be displayed to the screen.
    //
    int main( void )
    {
        //
        // OLE COM Interface
        // 
        HRESULT hr;
    
        // Get Clipeboard
        IDataObject* pcb = 0;
        OleGetClipboard(&pcb);
    
    
        // Get Clipeboard Data Interface
        FORMATETC format;
        format.cfFormat = CF_TEXT;
        format.ptd = NULL;
        format.dwAspect = DVASPECT_CONTENT;
        format.lindex = -1;
        format.tymed = TYMED_ISTREAM;
        STGMEDIUM medium;
        hr = pcb->GetData(&format, &medium);
        if( FAILED(hr) )
            return hr;
    
        // Get Stat of returned IStream
        IStream* pis = medium.pstm;
        STATSTG stat;
        ULONG cb = 0;
        hr = pis->Stat(&stat,STATFLAG_DEFAULT);
        if( SUCCEEDED(hr) )
        {
            if( stat.pwcsName )
                std::wcout << L"Name: " << stat.pwcsName << std::endl;
            std::cout << "DataSize: " << stat.cbSize.QuadPart << std::endl;
            std::cout << "Type: " << stat.type << std::endl;
            cb = stat.cbSize.QuadPart;
        }
    
        // Read Data from IStream
        std::vector<char> v;
        v.resize(cb);
        ULONG ret;
        hr = pis->Read(v.data(), cb, &ret);
        if( FAILED( hr ) )
        {
            std::cout << "Failed to Read" << std::endl;
        }
        else
        {
            std::string out(v.begin(),v.end());
            std::cout << "Read " << ret << "chars. Content: {" << out << "}" << std::endl;
        }
    
        pis->Release();
    
    //
    // My Output when I have 40 characters in Clipboard
    //
    // DataSize: 40
    // Type: 2
    // Read 0chars. Content: {                                        }
    // The number of characters are correct, but content always appear empty.
    
    }