⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 contutils.cpp

📁 这个是微软WINCE的OBEX协议例子
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/**************************************************************************/
/*  ContUtils.cpp                                                         */
/*                                                                        */
/*  This file contains utilities to beam contacts using OBEX              */
/*                                                                        */
/*	*'ed Functions are DLL entry points                                   */
/*                                                                        */
/*  Functions included:                                                   */
/*      CloseConnection     --   clean up a connection that has ended     */
/*      ServiceRequest      --   process a request (GET/PUT/CONNECT/etc)  */
/*     *DllServiceCallback  --   the entry point from the OBEX server     */
/*     *DllRegisterServer   --   init any required vars that can't be done*/
/*								    in DLL main                           */
/*     *DllUnregisterServer --   undoes DllRegisterServer                 */
/*	   *DllMain             --   init critical sections					  */
/*                                                                        */
/*  Other related files:                                                  */
/*                                                                        */
/*                                                                        */
/**************************************************************************/
#include <windows.h>
#include "Obex.h"
#include "vcard.h"
#include "VUtils.h"
#include "DeviceChooser.h"

#define RELEASE(x) \
	if(x) {x->Release(); x=0;} 

#define TRY()  __try{
#define TRYCATCH() } __except(1) { ASSERT(FALSE);} __try {
#define CATCH() } __except(1){ASSERT(FALSE);}

extern OID_TRANSLATOR g_sContactOidTranslator[];

char *MakeVCard(CEPROPVAL *pPropVal, UINT retrieved, UINT *uiDtaSize);
void AddLine(VCARD_LINE **vclList,CEPROPVAL *pPropVal, UINT uiTableIdx);

//globals
HINSTANCE g_hInst;

BOOL WINAPI DllMain(HANDLE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
    if(DLL_PROCESS_ATTACH == dwReason)
        g_hInst = (HINSTANCE)hinstDLL;

    return TRUE;
}

/*****************************************************************************/
/*   TransmitVCard                                                           */
/*   Given an array of CEOID's beam out the contacts using OBEX              */
/*                                                                           */
/*   Begin by searching for the contacts database, then open it,             */
/*      parse the records and beam using OBEX           					 */
/*                                                                           */
/*   Returns FALSE on error                                                  */
/*****************************************************************************/
int TransmitVCard(HWND hWndParent, PCEOID ceOID, UINT num)
{
   
    //initilize COM    
    IObex *pObex=0;
    CoInitializeEx(NULL, COINIT_MULTITHREADED);
    HRESULT hr = CoCreateInstance(CLSID_Obex, NULL, CLSCTX_INPROC_SERVER, IID_IObex,  
        (void **)&pObex);    
    
    if((FAILED(hr)) || (FAILED(pObex->Initialize())))
    {
        if (pObex)
            RELEASE(pObex);
        CoUninitialize();
        MessageBox(NULL, L"Error getting IObex object", L"Error", MB_OK);
        return FALSE;
    }

	//set device caps
    IObexCaps *pObexCaps = NULL;
    hr = pObex->QueryInterface(IID_IObexCaps, (LPVOID *)&pObexCaps);

    if(SUCCEEDED(hr))
	{
		pObexCaps->SetCaps(SEND_DEVICE_UPDATES);
		pObexCaps->Release();
	}

	    

    
    TRY();//BUGBUG
    
    IObexDevice *pObexDevice=0;
    if(ChooseService(g_hInst, hWndParent, pObex, &pObexDevice, INBOX_LISTEN_MASK) && pObexDevice)
    {         
        IHeaderCollection *pHeaderCollection=0;
        //get a header collection
        HRESULT hr = CoCreateInstance(CLSID_HeaderCollection, 
            NULL, 
            CLSCTX_INPROC_SERVER, 
            IID_IHeaderCollection,  
            (void **)&pHeaderCollection);                    
        TRY();//BUGBUG
        //now, using the object, connect up
        hr = pObexDevice->Connect(0,0,pHeaderCollection);
        RELEASE(pHeaderCollection);  
      
        
        if(FAILED(hr))
            MessageBox(hWndParent, L"Error connecting", L"Error", MB_OK);
        else
        {
            
             //open the contacts database
            BOOL fFound = FALSE;
            HANDLE hEnumDB = CeFindFirstDatabase(0);
            CEOID  WceObjID;
            CEOIDINFO WceObjInfo;  
            HANDLE hDB;
            
            TRY();//BUGBUG
            if(INVALID_HANDLE_VALUE == hEnumDB) 
            {                
                RELEASE(pObexDevice);
                pObex->Shutdown();
                RELEASE(pObex);
                return FALSE;
            }
            
            TRYCATCH();
            //search for the contacts database
            while((WceObjID = CeFindNextDatabase(hEnumDB)) != 0) {               
                if(!CeOidGetInfo(WceObjID, &WceObjInfo)) {                    
                    CloseHandle(hEnumDB);                   
                    RELEASE(pObexDevice);
                    pObex->Shutdown();
                    RELEASE(pObex);
                    return FALSE;
                }                
                else { 
                    if(wcscmp(_T("Contacts Database"),
                        WceObjInfo.infDatabase.szDbaseName) == 0)
                    { 
                        fFound = TRUE;
                        break;
                    }
                }
            }
           
            TRYCATCH();
            //open up the contacts database
            hDB = CeOpenDatabase(&WceObjID, 0, 0, CEDB_AUTOINCREMENT, NULL);

            if(hDB == INVALID_HANDLE_VALUE)
            {             
                RELEASE(pObexDevice);
                pObex->Shutdown();
                RELEASE(pObex);
                return FALSE;
            }
            
           
            TRYCATCH();
             //get another header collection
            CoCreateInstance(CLSID_HeaderCollection, 
                NULL, 
                CLSCTX_INPROC_SERVER, 
                IID_IHeaderCollection,  
                (void **)&pHeaderCollection);
            
            if(FAILED(hr)) 
            {
                RELEASE(pObexDevice);
                pObex->Shutdown();
                RELEASE(pObex);
                return FALSE;
            }     
           
            TRYCATCH();
            //put in the name
            pHeaderCollection->AddName(L"PocketPC.vcf");
            
            TRYCATCH();
            IStream *myStream=0;   
            hr = pObexDevice->Put(pHeaderCollection, &myStream);   
            for(UINT i=0; i<num; i++)
            {      
                TRY();
                
                WORD retrieved=0;
                DWORD dwBuf=0;
                PBYTE ppBuf=0;
                CEPROPVAL *propVal=0;              
                DWORD dwIndex;
                CEOID objId;
                HANDLE hHeap;
                UINT uiSize=0;                
                char *dta = 0;
                               
                hHeap = HeapCreate(0, 2048, 0); 
                //seek the contact record
                objId = CeSeekDatabase(hDB, CEDB_SEEK_CEOID, ceOID[i], &dwIndex);
                 
                //read in the record properties
                objId = CeReadRecordPropsEx(hDB,
                    CEDB_ALLOWREALLOC,
                    &retrieved,
                    NULL,
                    &ppBuf,
                    &dwBuf,hHeap);
                
                
               
                propVal = (CEPROPVAL *)ppBuf;
                ASSERT(propVal && retrieved);
                dta = MakeVCard(propVal, retrieved, &uiSize);
      
                //transmit the vCard
                ULONG ulWritten = 0;                
                if(dta && uiSize)
                {         
                    if(i!=0)
                        hr = myStream->Write("\n", 1, &ulWritten);
                    
                    if(SUCCEEDED(hr))
                        hr =  myStream->Write(dta, uiSize, &ulWritten);
                    
                    if(FAILED(hr) || ulWritten != uiSize)
                        MessageBox(hWndParent, L"Error occured during transmission.", L"Error", MB_OK);        
                }  
               
                if(dta)
                    delete [] dta;
                HeapDestroy(hHeap);  
                CATCH();
               
            }             
            RELEASE(pHeaderCollection);
            RELEASE(myStream);    
           

            //get ANOTHER header object
            hr = CoCreateInstance(CLSID_HeaderCollection, 
                NULL, 
                CLSCTX_INPROC_SERVER, 
                IID_IHeaderCollection,  
                (void **)&pHeaderCollection);
            TRYCATCH();//BUGBUG
            if(SUCCEEDED(hr))
            {
                pObexDevice->Disconnect(pHeaderCollection);
                RELEASE(pHeaderCollection);
            }
            else
            {
                ASSERT(FALSE);
            }
            
            CATCH();
        }

        RELEASE(pObexDevice);
        CATCH();//BUGBUG

    }
    pObex->Shutdown();
    RELEASE(pObex);
    CoUninitialize();
    CATCH();
    return TRUE;
}





/*****************************************************************************/
/*   MakeStringVCardCompliant                                                */
/*   Convert a string so its okay to send in a VCARD                         */
/*                                                                           */
/*   WARNING: this function allocates memory that it DOESNT FREE             */
/*                                                                           */
/*   BUGBUG: Need to encode certain characters                               */
/*                                                                           */
/*                                                                           */
/*   Returns FALSE on error                                                  */
/*****************************************************************************/
BOOL MakeStringVCardCompliant(LPWSTR in, char **out)
{
	char *retVal;

	//convert the string from unicode
	int requiredSize =
        WideCharToMultiByte (CP_ACP, 0, in, -1, 0, 0, NULL, NULL);

	retVal = new char[requiredSize];

	if(WideCharToMultiByte (CP_ACP, 0, in, -1, retVal, requiredSize, NULL, NULL) == 0)
		return FALSE;

	*out = retVal;
	return TRUE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -