亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? propset.cpp

?? 連接oracle
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1997 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.

#include "stdafx.h"

#if !defined(_MAC)

#include <malloc.h>
#include <ole2.h>
#include <oleauto.h>
#include "propset.h"

#ifdef AFXCTL_PROP_SEG
#pragma code_seg(AFXCTL_PROP_SEG)
#endif

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define new DEBUG_NEW


static LPVOID CountPrefixedStringA(LPCSTR lpsz)
{
	DWORD cb = (lstrlenA( lpsz ) + 1);
	LPDWORD lp = (LPDWORD)malloc( (int)cb + sizeof(DWORD) );
	if (lp)
	{
		*lp = cb;
		lstrcpyA( (LPSTR)(lp+1), lpsz );
	}

	return (LPVOID)lp;
}


static LPVOID CountPrefixedStringW(LPCWSTR lpsz)
{
	DWORD cb = (wcslen( lpsz ) + 1);
	LPDWORD lp = (LPDWORD)malloc( (int)cb * sizeof(WCHAR) + sizeof(DWORD) );
	if (lp)
	{
		*lp = cb;
		wcscpy( (LPWSTR)(lp+1), lpsz );
	}

	return (LPVOID)lp;
}


#ifdef _UNICODE
#define CountPrefixedStringT CountPrefixedStringW
#else
#define CountPrefixedStringT CountPrefixedStringA
#endif


#ifdef _UNICODE

#define MAX_STRLEN 1024

static LPBYTE ConvertStringProp(LPBYTE pbProp, DWORD dwType, ULONG nReps,
	size_t cbCharSize)
{
	LPBYTE pbResult = NULL; // Return value
	ULONG cbResult = 0;     // Number of bytes in pbResult
	LPBYTE pbBuffer;        // Temporary holding space
	ULONG cchOrig;          // Number of characters in original string
	ULONG cchCopy;          // Number of characters to copy
	ULONG cbCopy;           // Number of bytes to copy
	LPBYTE pbResultNew;     // Used for realloc of pbResult

	pbBuffer = (LPBYTE)malloc(MAX_STRLEN * cbCharSize);
	if (pbBuffer == NULL)
		return NULL;

	// If it's a vector, the count goes first.
	if (dwType & VT_VECTOR)
	{
		pbResult = (LPBYTE)malloc(sizeof(DWORD));
		if (pbResult == NULL)
		{
			free(pbBuffer);
			return NULL;
		}
		*(LPDWORD)pbResult = nReps;
		cbResult = sizeof(DWORD);
	}

	while (nReps--)
	{
		cchOrig = *(LPDWORD)pbProp;
		pbProp += sizeof(DWORD);

		// Convert multibyte string to Unicode.
		if (cbCharSize == sizeof(WCHAR))
		{
			cchCopy = _mbstowcsz((LPWSTR)pbBuffer, (LPSTR)pbProp,
				min(cchOrig, MAX_STRLEN));
		}
		else
		{
			cchCopy = _wcstombsz((LPSTR)pbBuffer, (LPWSTR)pbProp,
				min(cchOrig, MAX_STRLEN));
		}

		// Allocate space to append string.
		cbCopy = cchCopy * cbCharSize;
		pbResultNew = (LPBYTE)realloc(pbResult, cbResult + sizeof(DWORD) +
			cbCopy);

		// If allocation failed, cleanup and return NULL;
		if (pbResultNew == NULL)
		{
			free(pbResult);
			free(pbBuffer);
			return NULL;
		}

		pbResult = pbResultNew;

		// Copy character count and converted string into place,
		// then update the total size.
		memcpy(pbResult + cbResult, (LPBYTE)&cchCopy, sizeof(DWORD));
		memcpy(pbResult + cbResult + sizeof(DWORD), pbBuffer, cbCopy);
		cbResult += sizeof(DWORD) + cbCopy;

		// Advance to the next vector element
		pbProp += (cchOrig * cbCharSize);
	}

	free(pbBuffer);
	return pbResult;
}

#endif // _UNICODE


/////////////////////////////////////////////////////////////////////////////
//Implementation of the CProperty class

CProperty::CProperty( void )
{
	m_dwPropID = 0;

	m_dwType = VT_EMPTY;
	m_pValue = NULL;       // must init to NULL
}

CProperty::CProperty( DWORD dwID, const LPVOID pValue, DWORD dwType )
{
	m_dwPropID = dwID;
	m_dwType = dwType;
	m_pValue = NULL;       // must init to NULL
	Set( dwID, pValue, dwType );
}

CProperty::~CProperty()
{
	FreeValue();
}

BOOL CProperty::Set( DWORD dwID, const LPVOID pValue, DWORD dwType )
{
	m_dwType = dwType;
	m_dwPropID = dwID;

	return Set( pValue );
}

BOOL CProperty::Set( const LPVOID pValue, DWORD dwType )
{
	m_dwType = dwType;
	return Set( pValue );
}

BOOL CProperty::Set( const  LPVOID pVal )
{
	ULONG           cb;
	ULONG           cbItem;
	ULONG           cbValue;
	ULONG           nReps;
	LPBYTE          pCur;
	LPVOID          pValue = pVal;
	DWORD           dwType = m_dwType;
	LPVOID          pValueOrig = NULL;

	if (m_pValue != NULL)
	{
		FreeValue();
	}

	if (pValue == NULL || m_dwType == 0)
		return TRUE;

	// Given pValue, determine how big it is
	// Then allocate a new buffer for m_pValue and copy...
	nReps = 1;
	cbValue = 0;
	pCur = (LPBYTE)pValue;
	if (m_dwType & VT_VECTOR)
	{
		// The next DWORD is a count of the elements
		nReps = *(LPDWORD)pValue;
		cb = sizeof( nReps );
		pCur += cb;
		cbValue += cb;
		dwType &= ~VT_VECTOR;
	}
	else
	{
		// If we get any of the string-like types,
		// and we are not a vector create a count-prefixed
		// buffer.
		switch (dwType )
		{
			case VT_LPSTR:          // null terminated string      
				pValueOrig = pValue;
				pValue = CountPrefixedStringA( (LPSTR)pValueOrig );
				pCur = (LPBYTE)pValue;
			break;

			case VT_BSTR:           // binary string               
			case VT_STREAM:         // Name of the stream follows  
			case VT_STORAGE:        // Name of the storage follows 
			case VT_STREAMED_OBJECT:// Stream contains an object   
			case VT_STORED_OBJECT:  // Storage contains an object  
				pValueOrig = pValue;
				pValue = CountPrefixedStringT( (LPTSTR)pValueOrig );
				pCur = (LPBYTE)pValue;
			break;

			case VT_LPWSTR:         // UNICODE string 
				pValueOrig = pValue;
				pValue = CountPrefixedStringW( (LPWSTR)pValueOrig );
				pCur = (LPBYTE)pValue;
			break;
		}
	}

	// Since a value can be made up of a vector (VT_VECTOR) of
	// items, we first seek through the value, picking out
	// each item, getting it's size.
	//
	cbItem = 0;        // Size of the current item
	while (nReps--)
	{
		switch (dwType)
		{
			case VT_EMPTY:          // nothing                     
				cbItem = 0;
			break;

			case VT_I2:             // 2 byte signed int           
			case VT_BOOL:           // True=-1, False=0            
				cbItem = 2;
			break;

			case VT_I4:             // 4 byte signed int           
			case VT_R4:             // 4 byte real                 
				cbItem = 4;
			break;

			case VT_R8:             // 8 byte real                 
			case VT_CY:             // currency                    
			case VT_DATE:           // date                        
			case VT_I8:             // signed 64-bit int           
			case VT_FILETIME:       // FILETIME                    
				cbItem = 8;
			break;

			case VT_CLSID:          // A Class ID                  
				cbItem = sizeof(CLSID);
			break;

#ifndef _UNICODE
			case VT_BSTR:           // binary string               
			case VT_STREAM:         // Name of the stream follows  
			case VT_STORAGE:        // Name of the storage follows 
			case VT_STREAMED_OBJECT:// Stream contains an object   
			case VT_STORED_OBJECT:  // Storage contains an object  
			case VT_STREAMED_PROPSET:// Stream contains a propset  
			case VT_STORED_PROPSET: // Storage contains a propset  
#endif // _UNICODE
			case VT_LPSTR:          // null terminated string      
			case VT_BLOB_OBJECT:    // Blob contains an object     
			case VT_BLOB_PROPSET:   // Blob contains a propset     
			case VT_BLOB:           // Length prefixed bytes       
			case VT_CF:             // Clipboard format            
				// Get the DWORD that gives us the size, making
				// sure we increment cbValue.
				cbItem = *(LPDWORD)pCur;
				cb = sizeof(cbItem);
				pCur += cb;
				cbValue += cb;
			break;

#ifdef _UNICODE
			case VT_BSTR:           // binary string               
			case VT_STREAM:         // Name of the stream follows  
			case VT_STORAGE:        // Name of the storage follows 
			case VT_STREAMED_OBJECT:// Stream contains an object   
			case VT_STORED_OBJECT:  // Storage contains an object  
			case VT_STREAMED_PROPSET:// Stream contains a propset  
			case VT_STORED_PROPSET: // Storage contains a propset  
#endif // _UNICODE
			case VT_LPWSTR:         // UNICODE string 
				cbItem = *(LPDWORD)pCur * sizeof(WCHAR);
				cb = sizeof( cbItem );
				pCur += cb;
				cbValue += cb;
			break;
	        case VT_VARIANT:        // VARIANT*                
	        break;

			default:
				if (pValueOrig)
					free( pValue );
				return FALSE;
		}

		// Add 'cb' to cbItem before seeking...
		//
		// Seek to the next item
		pCur += cbItem;
		cbValue += cbItem;
	}

	if (NULL == AllocValue(cbValue))
	{
		TRACE0("CProperty::AllocValue failed");
		return FALSE;
	}
	memcpy( m_pValue, pValue, (int)cbValue );

	if (pValueOrig)
		free( pValue );

	return TRUE;
}

LPVOID CProperty::Get( void )
{   return Get( (DWORD*)NULL );   }

LPVOID CProperty::Get( DWORD* pcb )
{
	DWORD   cb;
	LPBYTE  p = NULL;

	p = (LPBYTE)m_pValue;

	// m_pValue points to a Property "Value" which may
	// have size information included...
	switch( m_dwType )
	{
		case VT_EMPTY:          // nothing                     
			cb = 0;
		break;

		case VT_I2:             // 2 byte signed int           
		case VT_BOOL:           // True=-1, False=0            
			cb = 2;
		break;

		case VT_I4:             // 4 byte signed int           
		case VT_R4:             // 4 byte real                 
			cb = 4;
		break;

		case VT_R8:             // 8 byte real                 
		case VT_CY:             // currency                    
		case VT_DATE:           // date                        
		case VT_I8:             // signed 64-bit int           
		case VT_FILETIME:       // FILETIME                    
			cb = 8;
		break;

#ifndef _UNICODE
		case VT_BSTR:           // binary string               
		case VT_STREAM:         // Name of the stream follows  
		case VT_STORAGE:        // Name of the storage follows 
		case VT_STREAMED_OBJECT:// Stream contains an object   
		case VT_STORED_OBJECT:  // Storage contains an object  
		case VT_STREAMED_PROPSET:// Stream contains a propset  
		case VT_STORED_PROPSET: // Storage contains a propset  
#endif // UNICODE
		case VT_LPSTR:          // null terminated string      
		case VT_CF:             // Clipboard format            
			// Read the DWORD that gives us the size, making
			// sure we increment cbValue.
			cb = *(LPDWORD)p;
			p += sizeof( DWORD );
		break;

		case VT_BLOB:           // Length prefixed bytes       
		case VT_BLOB_OBJECT:    // Blob contains an object     
		case VT_BLOB_PROPSET:   // Blob contains a propset     
			// Read the DWORD that gives us the size.
			cb = *(LPDWORD)p;
		break;

#ifdef _UNICODE
		case VT_BSTR:           // binary string               
		case VT_STREAM:         // Name of the stream follows  
		case VT_STORAGE:        // Name of the storage follows 
		case VT_STREAMED_OBJECT:// Stream contains an object   
		case VT_STORED_OBJECT:  // Storage contains an object  
		case VT_STREAMED_PROPSET:// Stream contains a propset  
		case VT_STORED_PROPSET: // Storage contains a propset  
#endif // _UNICODE
		case VT_LPWSTR:         // UNICODE string 
			cb = *(LPDWORD)p * sizeof(WCHAR);
			p += sizeof( DWORD );
		break;

		case VT_CLSID:          // A Class ID                  
			cb = sizeof(CLSID);
		break;

        case VT_VARIANT:        // VARIANT*                
        break;

		default:
			return NULL;
	}
	if (pcb != NULL)
		*pcb = cb;

	return p;
}

DWORD  CProperty::GetType( void )
{   return m_dwType;  }

void   CProperty::SetType( DWORD dwType )
{   m_dwType = dwType; }

DWORD CProperty::GetID( void )
{   return m_dwPropID;   }

void CProperty::SetID( DWORD dwPropID )
{    m_dwPropID = dwPropID;   }

LPVOID CProperty::GetRawValue( void )
{   return m_pValue; }

BOOL CProperty::WriteToStream( IStream* pIStream )
{
	ULONG           cb;
	ULONG           cbTotal; // Total size of the whole value
	DWORD           dwType = m_dwType;
	DWORD           nReps;
	LPBYTE          pValue;
	LPBYTE          pCur;
	BOOL            bSuccess = FALSE;
	BYTE            b = 0;

	nReps = 1;
	pValue = (LPBYTE)m_pValue;
	pCur = pValue;
	cbTotal = 0;
	if (m_dwType & VT_VECTOR)
	{
		// Value is a DWORD count of elements followed by
		// that many repititions of the value.
		//
		nReps = *(LPDWORD)pCur;
		cbTotal = sizeof(DWORD);
		pCur += cbTotal;
		dwType &= ~VT_VECTOR;
	}

#ifdef _UNICODE
	switch (dwType)
	{
		case VT_BSTR:           // binary string               
		case VT_STREAM:         // Name of the stream follows  
		case VT_STORAGE:        // Name of the storage follows 
		case VT_STREAMED_OBJECT:// Stream contains an object   
		case VT_STORED_OBJECT:  // Storage contains an object  
		case VT_STREAMED_PROPSET:// Stream contains a propset  
		case VT_STORED_PROPSET: // Storage contains a propset  
			pValue = ConvertStringProp(pCur, m_dwType, nReps, sizeof(char));
			if (m_dwType & VT_VECTOR)
				pCur = pValue + sizeof(DWORD);
		break;
	}
#endif // _UNICODE

	// Figure out how big the data is.
	while (nReps--)
	{
		switch (dwType)
		{
			case VT_EMPTY:          // nothing                     
				cb = 0;
			break;

			case VT_I2:             // 2 byte signed int           
			case VT_BOOL:           // True=-1, False=0            
				cb = 2;
			break;

			case VT_I4:             // 4 byte signed int           
			case VT_R4:             // 4 byte real                 
				cb = 4;
			break;

			case VT_R8:             // 8 byte real                 
			case VT_CY:             // currency                    
			case VT_DATE:           // date                        
			case VT_I8:             // signed 64-bit int           
			case VT_FILETIME:       // FILETIME                    
				cb = 8;
			break;

			case VT_LPSTR:          // null terminated string      

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
污片在线观看一区二区| 国产精品污网站| 一区二区三区四区视频精品免费| 亚洲国产精品尤物yw在线观看| 蜜臀av在线播放一区二区三区| 国产精品一级在线| 欧美美女视频在线观看| 国产亚洲精品aa| 亚洲精品中文在线| 免费观看一级特黄欧美大片| 91一区二区在线| 久久影院午夜片一区| 亚洲一区在线观看视频| 国产成人啪午夜精品网站男同| 欧美日韩三级一区二区| 国产精品久久一卡二卡| 免费观看91视频大全| 色哟哟一区二区三区| 欧美日韩国产系列| 国产精品免费视频网站| 美女精品一区二区| 在线亚洲欧美专区二区| 欧美激情在线看| 亚洲日本电影在线| 亚洲一区二区三区自拍| hitomi一区二区三区精品| 精品国产乱码久久久久久夜甘婷婷 | 九九精品视频在线看| 26uuu久久综合| 欧美精品1区2区| 国产福利91精品一区| 欧美tickle裸体挠脚心vk| 亚洲国产成人va在线观看天堂| 欧美中文字幕不卡| 日韩电影免费在线看| 精品国产污网站| 国产成人精品亚洲777人妖| 国产精品动漫网站| 色成年激情久久综合| 亚洲电影中文字幕在线观看| 91精品国模一区二区三区| 国产在线观看一区二区| 国产精品色在线观看| 91丝袜呻吟高潮美腿白嫩在线观看| 夜夜操天天操亚洲| 3751色影院一区二区三区| 国产精品中文有码| 亚洲三级电影网站| 欧美日韩大陆在线| 看国产成人h片视频| 国产婷婷精品av在线| 91久久国产综合久久| 蜜桃传媒麻豆第一区在线观看| 国产女同互慰高潮91漫画| 在线亚洲高清视频| 免费观看日韩av| 国产精品福利影院| 欧美福利视频导航| 国产91精品一区二区麻豆网站| 亚洲精品网站在线观看| 欧美一区二区三区四区久久 | 一区二区三区视频在线看| 91麻豆精品国产自产在线观看一区| 国产乱码精品一区二区三区av| 亚洲天天做日日做天天谢日日欢| 欧美一级一区二区| av欧美精品.com| 蜜桃视频第一区免费观看| 自拍av一区二区三区| 精品欧美久久久| 95精品视频在线| 久久99精品一区二区三区| 亚洲日本中文字幕区| 精品欧美乱码久久久久久1区2区| 一本一本大道香蕉久在线精品| 久久超碰97中文字幕| 亚洲一区在线免费观看| 国产农村妇女毛片精品久久麻豆| 欧美日韩亚洲综合在线| 欧美伊人久久久久久久久影院| 欧美丰满少妇xxxbbb| 日本视频在线一区| 国产精品美女久久久久久久网站| 欧美一区二区三区四区五区| 91同城在线观看| 国产一区久久久| 亚洲不卡av一区二区三区| 国产精品久久久久永久免费观看 | 久久九九久久九九| 日本乱码高清不卡字幕| 国产精品 欧美精品| 日韩av电影免费观看高清完整版 | 国产精品久久久久久久久免费桃花| 欧美肥妇毛茸茸| 色综合久久久久久久久久久| 国产在线不卡视频| 日韩精品色哟哟| 国产精品丝袜在线| 久久综合九色综合欧美就去吻| 欧美日韩中文字幕精品| av电影天堂一区二区在线| 国产中文字幕一区| 日韩精品色哟哟| 亚洲成人免费在线| 亚洲欧美日韩精品久久久久| 久久亚洲精品小早川怜子| 欧美一区二区三区日韩| 精品视频一区三区九区| 91在线无精精品入口| 国产精品亚洲专一区二区三区| 免费一级欧美片在线观看| 亚洲v精品v日韩v欧美v专区 | 日本一区二区不卡视频| 精品久久久久一区二区国产| 欧美片网站yy| 在线精品视频免费播放| 91香蕉国产在线观看软件| 国产99久久精品| 国产一区二区导航在线播放| 久88久久88久久久| 欧美aaa在线| 五月天一区二区三区| 亚洲一区二区三区四区五区黄 | 91福利精品视频| 99久久精品国产麻豆演员表| 国产成人综合在线| 狠狠色丁香久久婷婷综合_中| 麻豆国产精品官网| 琪琪久久久久日韩精品| 麻豆极品一区二区三区| 免费在线观看视频一区| 免费美女久久99| 久久精品二区亚洲w码| 久久99久久久久| 国产在线精品一区二区| 国产一区二区三区四区五区入口| 九色综合狠狠综合久久| 国产乱码精品一区二区三区av| 国产精品自拍一区| 国产传媒欧美日韩成人| 国产传媒日韩欧美成人| 99久久夜色精品国产网站| 色综合天天综合网国产成人综合天 | 久久影院午夜论| 国产婷婷色一区二区三区在线| 国产精品色婷婷| 中文字幕中文字幕一区| 亚洲欧美日韩国产综合在线| 亚洲另类在线一区| 午夜欧美2019年伦理| 日本vs亚洲vs韩国一区三区| 精品综合免费视频观看| 国产乱码精品一区二区三| 成人黄色电影在线| 在线国产亚洲欧美| 欧美一二三区在线| 久久久99精品久久| 国产精品久久久久久久久免费桃花 | 国产日韩欧美高清在线| 久久综合久久综合亚洲| 久久久91精品国产一区二区精品 | 欧美一区二区在线免费播放| 欧美电影免费观看高清完整版在 | 1024亚洲合集| 一区二区高清在线| 日本不卡视频在线| 国产麻豆一精品一av一免费| 国产成都精品91一区二区三| k8久久久一区二区三区| 欧美性猛交xxxxxxxx| 欧美一级日韩免费不卡| 日本一区二区不卡视频| 亚洲国产日韩精品| 日本不卡视频在线观看| 国产99久久久国产精品潘金网站| 91蝌蚪porny| 欧美一区二区视频在线观看2022| ww久久中文字幕| 椎名由奈av一区二区三区| 日韩精品一区第一页| 国产69精品久久777的优势| 欧美最新大片在线看| 日韩一区二区三区精品视频| 中文字幕av一区二区三区免费看| 一区二区三区精密机械公司| 久久精品久久99精品久久| 成人激情电影免费在线观看| 欧美精品视频www在线观看| 久久久久久久久岛国免费| 亚洲精品视频自拍| 九色综合狠狠综合久久| 色妹子一区二区| 久久午夜色播影院免费高清| 亚洲欧美激情一区二区| 青草国产精品久久久久久| 成人动漫精品一区二区| 91精品国产91久久久久久一区二区| 亚洲国产精品传媒在线观看| 天天综合色天天| 99久久精品一区二区|