【问题标题】:COM/ActiveX and Downloading urlCOM/ActiveX 和下载地址
【发布时间】:2012-12-25 02:43:48
【问题描述】:

我有一个 ActiveX,它向服务器请求 URL 并下载/读取数据并请求新的数据缓冲区,直到完成。数据被正确读取,但如果我观察任务管理器,IE 的内存和句柄会上升,而且永远不会下降。进程资源管理器显示句柄是缓存文件。

int AXGetUrl(char*     url,
             void*     buffer,   
             int       buffer_size,
             void*     pUnk)
{
char                    buffer2[256];
int                     rc;
HRESULT                 rc2;
ULONG                   buffer_len;
ULONG                   buffer_len2;
IStream*                pStream;
char                    newurl[1024];
ULONG64                 RequestBytes;
CURLCallBack            UCB;

    //Initialize
    rc = 0;
    rc2 = 0;
    memset(newurl,
           0x00,
           sizeof(newurl));
    buffer_len = 0;
    pStream = NULL;
    RequestBytes = 0;
    strcpy(newurl,
           url);

    rc = URLOpenBlockingStream((IUnknown *)pUnk,
                               url,
                               &pStream,
                               0,
                               &UCB);    
    while (rc == 0)
        {
        if  (pStream != NULL)
            {
            rc2 = pStream->Read(buffer,
                                buffer_size,
                                &buffer_len);
            RequestBytes = RequestBytes + buffer_len;

            pStream->Release();        
            pStream = NULL;

            buildnewurl(newurl,
                        RequestBytes);
            rc = URLOpenBlockingStream((IUnknown *)pUnk,
                                       newurl,
                                       &pStream,
                                       0,
                                       &UCB);
            }
        else
            {
            rc = 1;
            }
        }

    return (rc);
}

更新:

#include "stdafx.h"
#include "Test.h"

Test::Test()
{
}
Test::~Test()
{
}

HRESULT Test::FinalConstruct()
{
void*       pUnk = NULL;
void*       buffer = NULL;
int         buffer_size = 131072;
ULONG       buffer_len = 0;
HRESULT     rc = 0;
HRESULT     rc2 = 0;
IStream*    pStream = NULL;
int         counter = 0;
char        url[1024];

    rc = QueryInterface(IID_IUnknown, &pUnk);
    buffer = malloc(buffer_size);
    if  (buffer != NULL)
        {
        //Get URL
        sprintf(url,
                "http://search.yahoo.com/search?p=%d",
                counter);
        rc = URLOpenBlockingStream((IUnknown *)pUnk,
                                    url,
                                    &pStream,
                                    0,
                                    NULL);    
        while (rc == 0)
            {
            if  (pStream != NULL)
                {
                rc2 = pStream->Read(buffer,
                                    buffer_size,
                                    &buffer_len);
                pStream->Release();        
                pStream = NULL;

                counter++;
                if (counter == 15)
                    {
                    break;
                    }
                sprintf(url,
                        "http://search.yahoo.com/search?p=%d",
                        counter);
                rc = URLOpenBlockingStream((IUnknown *)pUnk,
                                           url,
                                           &pStream,
                                           0,
                                           NULL);
                }
            else
                {
                rc = 1;
                }
            }
        free(buffer);
        }

    return (S_OK);
}

void Test::FinalRelease()
{
    return;
}

【问题讨论】:

    标签: c++ internet-explorer plugins com activex


    【解决方案1】:

    您正在调用“URLOpenBlockingStream”以检索流对象,但它返回的流永远不会被删除。假设 IStream 是一个 COM 对象,您需要在完成 pStream 后调用 Release()...

    rc = URLOpenBlockingStream((IUnknown *)pUnk,
                               url,
                               &pStream,
                               0,
                               &UCB);
    while (rc == 0)
    {
        // ... your code here...
    }
    
    if(pStream != NULL)
    {
        pStream->Release();
    }
    

    【讨论】:

    • 正确,我确实有一个 ->Relase() 被调用。修改了我上面的代码以取出其中一个 Read() 并仍然获得缓存文件的打开句柄。每次成功读取(读取所有数据)后,我需要请求另一个新 URL。
    • 那么问题存在于您发布的代码之外。您将需要发布与问题更相关的代码或使用调试器进行挖掘。
    • 这是我所有的 C 代码,我可以做到的最小的代码,并提供了一个实际的问题示例。如果您认为 H、rc 或 idl 文件是必要的,我可以添加它们。如果有什么我想念的,请告诉我。
    猜你喜欢
    • 2012-10-17
    • 2010-12-16
    • 2010-09-16
    • 2010-12-18
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2016-12-22
    相关资源
    最近更新 更多