CopyMemory((PVOID)pbBuffer

Java全栈面试宝典:从P6到P8-10 答案: CAP定理说一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)中的两个。C:所有节点在同一时刻看到的数据一样。你写了一个值,立刻读,不管从哪个节点读,都能读到最新值。A:每个请求都能得到非错误的响应,即使某些节点挂了。系统一直能对外服务,不会返回超时或拒绝。P:网络分区发生时,系统仍能继续工作。网络分区就是节点之间网络不通了,但节点本身还活着。CAP不是"三选二",而是当网络分区发生时,你必须在C和 阅读详情

/*  Initialization */
    void Init(LPBYTE pbData, LONGLONG llLength, DWORD dwKBPerSec = INFINITE)
    {
        m_pbData = pbData;
        m_llLength = llLength;
        m_dwKBPerSec = dwKBPerSec;
        m_dwTimeStart = timeGetTime();
    }

    HRESULT SetPointer(LONGLONG llPos)
    {
        if (llPos < 0 || llPos > m_llLength) {
            return S_FALSE;
        } else {
            m_llPosition = llPos;
            return S_OK;
        }
    }

    HRESULT Read(PBYTE pbBuffer,
                 DWORD dwBytesToRead,
                 BOOL bAlign,
                 LPDWORD pdwBytesRead)
    {
        CAutoLock lck(&m_csLock);
        DWORD dwReadLength;

        /*  Wait until the bytes are here! */
        DWORD dwTime = timeGetTime();

        if (m_llPosition + dwBytesToRead > m_llLength) {
            dwReadLength = (DWORD)(m_llLength - m_llPosition);
        } else {
            dwReadLength = dwBytesToRead;
        }
        DWORD dwTimeToArrive =
            ((DWORD)m_llPosition + dwReadLength) / m_dwKBPerSec;

        if (dwTime - m_dwTimeStart < dwTimeToArrive) {
            Sleep(dwTimeToArrive - dwTime + m_dwTimeStart);
        }

        CopyMemory((PVOID)pbBuffer, (PVOID)(m_pbData + m_llPosition),
                   dwReadLength);

        m_llPosition += dwReadLength;
        *pdwBytesRead = dwReadLength;
        return S_OK;
    }

    LONGLONG Size(LONGLONG *pSizeAvailable)
    {
        LONGLONG llCurrentAvailable =
            static_cast <LONGLONG> (UInt32x32To64((timeGetTime() - m_dwTimeStart),m_dwKBPerSec));
 
       *pSizeAvailable =  min(m_llLength, llCurrentAvailable);
        return m_llLength;
    }

    DWORD Alignment()
    {
        return 1;
    }

    void Lock()
    {
        m_csLock.Lock();
    }

    void Unlock()
    {
        m_csLock.Unlock();
    }

private:
    CCritSec       m_csLock;
    PBYTE          m_pbData;
    LONGLONG       m_llLength;
    LONGLONG       m_llPosition;
    DWORD          m_dwKBPerSec;
    DWORD          m_dwTimeStart;
};

class CAsyncFilter : public CAsyncReader, public IFileSourceFilter
{
public:
    CAsyncFilter(LPUNKNOWN pUnk, HRESULT *phr) :
        CAsyncReader(NAME("Mem Reader"), pUnk, &m_Stream, phr),
        m_pFileName(NULL),
        m_pbData(NULL)
    {
    }

    ~CAsyncFilter()
    {
        delete [] m_pbData;
        delete [] m_pFileName;
    }

    static CUnknown * WINAPI CreateInstance(LPUNKNOWN, HRESULT *);

    DECLARE_IUNKNOWN

    STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv)
    {
        if (riid == IID_IFileSourceFilter) {
            return GetInterface((IFileSourceFilter *)this, ppv);
        } else {
            return CAsyncReader::NonDelegatingQueryInterface(riid, ppv);
        }
    }

    /*  IFileSourceFilter methods */

    //  Load a (new) file
    STDMETHODIMP Load(LPCOLESTR lpwszFileName, const AM_MEDIA_TYPE *pmt)
    {
        CheckPointer(lpwszFileName, E_POINTER);

        // lstrlenW is one of the few Unicode functions that works on win95
        int cch = lstrlenW(lpwszFileName) + 1;

#ifndef UNICODE
        TCHAR *lpszFileName=0;
        lpszFileName = new char[cch * 2];
        if (!lpszFileName) {
              return E_OUTOFMEMORY;
        }
        WideCharToMultiByte(GetACP(), 0, lpwszFileName, -1,
                lpszFileName, cch, NULL, NULL);
#else
 

PVOID P表示指针,那么PVOID表示  void * 无类型指针 下面看到论坛上的解释,觉得说得很不错,共享下哈哈 所有指针都是一个32位二进制数(32位系统下),这个意义上说所有指针都是一样的,它们的大小一样,用于指向内存中的某处地址,然而指针为什么要有类型之分呢?答案是指针偏移。例如p为一个指针,它指向内存某处地址,那么p+1(或者写p[1])是什么意思呢?答案是p指向地 阅读详情

相关推荐

奇怪的PVOID参数--SystemParametersInfo的使用

PVOID SystemParametersInfo

jiaodou2的博客 740

LPVOIDPVOID的区别是什么

LinuxTiger 回复于: 2014-05-24 22:31:03 PVOID是void*的别名。在windef.h中,LPVOID是这么定义的:typedef void far *LPVOID。和void*的区别是远指针,因为win32编程中,经常要调用外部DLL堆变量。但现在的大部分平台已经无所谓了,因为寻址方式成flat了。 caozhy 回复于: 2014-05-24 22:57:

山寨步兵的专栏 9425

PVOID是什么数据类型

PVIOD 一个普通指针类型等价于(viod *)还有一些对你有用win api 编程中的数据类型很多,有没有人能 具体讲讲啊?CALLBACK 在应用程序的回调例程中取代FAR PASCALHANDLE 一个32位的无符号整数,用作句柄HDC 设备描述句柄HWND 一个32位的无符号整数用作窗口句柄LONG 一个32位的带符号整数LPARAM 用于声明lParam的类型LPCSTR 与LPSTR...

snowfoxmonitor的专栏 1万+

PVOID 型指针

P表示指针,那么PVOID表示  void * 无类型指针 下面看到论坛上的解释,觉得说得很不错,共享下哈哈 所有指针都是一个32位二进制数(32位系统下),这个意义上说所有指针都是一样的,它们的大小一样,用于指向内存中的某处地址,然而指针为什么要有类型之分呢?答案是指针偏移。例如p为一个指针,它指向内存某处地址,那么p+1(或者写p[1])是什么意思呢?答案是p指向地

gyuzhe8的专栏 1056

PVOID 无类型指针

https://blog.csdn.net/fangcaixia498602700/article/details/6893788

weixin_40710375的博客 394

C语言-void与void*详解

内容包括void的含义与使用、void (*b[10]) (void (*)( ));的解说。

让你爱上电路设计 8402

what is PVOID ??

It's a void pointer -- a pointer to a memory address with no information about the type of the value that it is pointing to. For this reason, you must cast the pointer to a type such as (char *)pMem

FrankieWang008的专栏 961

PVOID 转换

int a; void *p; p=&a;  a =  *((int *) p)

程序猿进化史 758

2024年C C++最全算法导论代码 第10章 基本数据结构_void ( p)(struct key key),如果不想35岁被淘汰这篇文章必看

*哑元结点,用来代替NULL */(img-V38dvkoJ-1715541840844)](img-s3PCeOYi-1715541840845)]/*num比要存放在队列中的元素个数多一,是为了区分队列满和空的状态 */printf(“查找关键字:%d的结果:%s\n”, k,“成功” : “失败”);printf(“删除关键字:%d的结果:\n”, k);带哨兵的环形双向链表。

2401_84976207的博客 1050

【Qt/C++异常笔记】间接寻址级别不同

异常描述: error: C2040: “PVOID”:“void *”与“uint32”的间接寻址级别不同,如图: 异常原因: 引用了两个外部库,两个库文件都没有源代码,两个库文件中都定义了PVOID这个变量,并且分别被定义为 void * 和 uint32 类型,导致变量重定义。 解决方法: 1、封装SDK后再使用; 以SDK1为例:写一个.h和一个.cpp,在.h中写上你所需要的所有接口,在.cpp中调用SDK1去实现; 但是注意在.h中不要include任何SDK1中的..

Lizhifun 5027

C++指针整理

写这篇博客主要是在学习C++指针的过程中,发觉关于指针的类型与语法还是比较多的,而自己在整理的过程中发现只是声明各种类型的指针就是个很有意思的过程,所以想着在博客进行一个比较系统的个人整理。指针变量就是存储其他变量地址的变量。不仅可以通过指针得到其他变量的地址,还可以根据该地址得到其他变量的具体的值。在此篇博客中,对于C++中的指针的各种用途进行了介绍,并对各个的用途的注意事项进行了讲解。但其实指针还有很多其他灵活但比较复杂的使用方式,例如:返回值为函数指针的函数要怎么定义?

m0_51099698的博客 684

pb中如何应付指针类型

在pb中使用WIN API和调用dll中的外部函数时,往往要用到指针。sybase公司pb对指针的说明文字很少,但可以看到在pb一些例子中,使用了这些技术。特别是有了pb的反编译工具后,能“阅读”到更多的pb程序代码,借鉴其中的方法。以下是一些坊间流传的pb处理指针的方法。有了这些方法,pb与vc之间的通道就更畅通了。 1、pb中,用字符串地址得到字符串 pb的函数String就可

BlackIce的专栏 4283

powerbuilder PB 操作内存

PB操作内存         我们知道pb中不支持指针,但我们在使用WIN32 API和调用一些dll中的外部函数时候,经常会与其打些交道,所以这里将相关的一些技巧收集整理起来。 1、根据字符串地址得到字符串 完全通过pb自带的函数String

2336

测试CopyMemory函数的速度

系统简介 CopyMemory函数的功能:将一块内存的数据从一个位置复制到另一个位置。其中,两个内存块不能有重叠部分。 测试环境 windows版本:windows 7 旗舰版 sp1 系统类型:64位 处理器:英特尔 Pentium(奔腾) 双核 E5400 @ 2.70GHz 内存:4GB 内存条:两根 记忆科技 DDR3 1333MHz 2GB 编译器:microsoft visua

番茄鸡蛋的专栏 2911
上一篇: Save a pointer to the data that was read from the file
下一篇: Define an internal filter that wraps the base CBaseReader stuff
刺痛仁辛
博客等级 码龄4年 43粉丝 · 125原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刺痛仁辛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值