下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、文檔來源為 :從網(wǎng)絡(luò)收集整理 .word 版本可編輯 .歡迎下載支持 The information in this article applies to: - Microsoft Visual C+ 6.0,SP5 結(jié)構(gòu)或大內(nèi)存塊打包的辦法 (上 1.1) Revision History: Version Date Creator Description 2004-2-23 鄭昀 草稿 Implementation Scope: 繼續(xù)閱讀之前,我們假設(shè)您熟悉以下知識: n SAFEARRAY n ISTREAM n Microsoft MSMQ 目錄: 1:概述 2:借用 SAFEARRA
2、Y 打包把結(jié)構(gòu)寫入 MSMQ 隊列 3:借用 IStream 流打包傳遞數(shù)據(jù)到 MSMQ 隊列 1.概述 通常我們建議通過 MSMQ 傳遞基于 XML 的字符串,但有時候也需要傳遞一些結(jié)構(gòu)或者一些接 口指針,那么如何打包傳遞呢? 這實際上可以轉(zhuǎn)換為一個普適問題: 如何把一個結(jié)構(gòu)體(structure object)或者巨大內(nèi)存塊(比如 5MB 左右)打包為 PROPVARIANT-compatible 的類型? 首先, IMSMQMessagePtr 的 Body 屬性接收 _variant_t 參數(shù) : inline void IMSMQMessage:PutBody ( const _va
3、riant_t if (FAILED(_hr) _com_issue_errorex(_hr, this, _uuidof(this); 如果我們想把結(jié)構(gòu)作為消息的 Body 寫入 MSMQ 消息隊列,我們需要把我們的結(jié)構(gòu)、大內(nèi)存塊 或接口指針轉(zhuǎn)換為 _variant_t。 2.借用 SAFEARRAY 打包把結(jié)構(gòu)寫入 MSMQ 隊列 把一個結(jié)構(gòu)體打包為 PROPVARIANT-compatible 的類型, 需要用到 SAFEARRAY ,一個帶有邊界 信息的數(shù)組。這是一個常用技巧,很多文章都有提及,我就不多解釋了。 但是,注意這種方式一次只能打包 65536 字節(jié)以下的數(shù)據(jù),這是由于 SA
4、FEARRAY* SafeArrayCreateVector( VARTYPE vt, long lLbound, unsigned int cElements); 的定義所限制的。 我們通常會用 SafeArrayCreateVector API 創(chuàng)建一個單維 SAFEARRAY ,分配一個 sizeof(_DATA) 大小的連續(xù)內(nèi)存塊,而這個函數(shù)的第三個參數(shù)是一個 unsigned int 類型,所以最大值就只能是 65536 了。 更多SAFEARRAY知識,參見使用SAFEARRA傳遞對象。 下面給出打包的步驟( VC+ 代碼): 這里本還有很長一段代碼,由于文檔長度限制為64KB,只
5、好放在上1.2篇了,希望諒解。 結(jié)構(gòu)或大內(nèi)存塊打包的辦法(上 1.2 ) 上 2 篇繼續(xù)介紹如何讀取這樣的 MSMQ 消息。 結(jié)構(gòu)或大內(nèi)存塊打包的辦法(上 2) 中、下篇將介紹“借用 IStream 流打包傳遞數(shù)據(jù)到 MSMQ 隊列”。 結(jié)構(gòu)或大內(nèi)存塊打包的辦法(中) 結(jié)構(gòu)或大內(nèi)存塊打包的辦法(下) 、 、 結(jié)構(gòu)或大內(nèi)存塊打包的辦法(上 1.2) Revision History: Version Date Creator Description 2004-2-23 鄭昀 草稿 2.借用 SAFEARRAY 打包把結(jié)構(gòu)寫入 MSMQ 隊列 續(xù)上1.1篇的打包步驟(VC+代碼): / Chang
6、eStruct2Var函數(shù)的定義: / 第一個參數(shù): / 類型: CComVariant / 作用:接收者 / 第二個參數(shù): / 類型: _DATA* / 作用:源 HRESULT ChangeStruct2Variant (CComVariant / 使用 SafeArrayCreateVector API 創(chuàng)建一個單維 SAFEARRAY ,分配一個 sizeof(_DATA) 大小的 連續(xù)內(nèi)存塊 / VT-UI1 代表非負(fù)整形的變量類型, 1 個字節(jié) / 常數(shù) 0定義數(shù)組的下界 LPSAFEARRAY lpsa = SafeArrayCreateVector(VT_UI1, 0, siz
7、eof(_DATA); LPBYTE pbData = NULL; if (lpsa) 在你訪問SAFEARRAY數(shù)據(jù)之前,你必須調(diào)用 SafeArrayAccessData。該函數(shù)鎖定數(shù)據(jù)并且返 回一個指針。在這里,鎖定數(shù)組意味著增加該數(shù)組的內(nèi)部計數(shù)器(cLocks) hr = SafeArrayAccessData(lpsa, (void *) else hr = HRESULT_FROM_WIN32(GetLastError(); if (SUCCEEDED(hr) / 使用 safe array: / 將傳入的 _DATA 指針指向的內(nèi)存復(fù)制到 pbData CopyMemory(pb
8、Data, pData, sizeof(*pData); / 設(shè)置 var 的類型為數(shù)組 var.vt = VT_ARRAY|VT_UI1; / 將 var 和我們的單維 SAFEARRAY 拉上關(guān)系: var.parray = lpsa; if (pbData) /相應(yīng)用來釋放數(shù)據(jù)的函數(shù)是 SafeArrayUnaccessData(),該功能釋放該參數(shù)的計數(shù) SafeArrayUnaccessData(var.parray); if (FAILED(hr) / 銷毀 SAFEARRAY SafeArrayDestroy(lpsa); return hr; / /Added Headers:
9、 / #include #include / /Added for MSMQ: / #import mqoa.dll no_namespace, named_guids typedef struct _DATA int _n; char _str; _DATA; /main: IMSMQMessagePtr pisMsg = NULL; hr = pisMsg.CreateInstance(MSMQ.MSMQMessage); _DATA msg; msg._n = 1; msg._str = 1; CComVariant var; / 打包函數(shù): ChangeStruct2Variant(var, / 打包后的 CComVariant 傳遞給 MSMQMessege 的 Body 屬性: pisMsg-Body= var; pisMsg-AppSpecific=-1; / 發(fā)送到消息隊列: pisMsg-Send(pisQueue); 這樣,就可以成功地把一個結(jié)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年規(guī)范化場地租賃商業(yè)活動協(xié)議樣本版
- 二零二五年度農(nóng)業(yè)科技股東入股分紅與種植養(yǎng)殖協(xié)議書3篇
- 2025版綠化工程生態(tài)修復(fù)與保護(hù)合同3篇
- 2025年新疆貨運(yùn)從業(yè)資格考試模擬考試題及答案
- 二零二五年度國際科技創(chuàng)新合作論壇策劃合同3篇
- 二零二五年度太陽能光伏電站安裝工程合同范本2篇
- 2024石材荒料購銷及石材雕刻工藝傳承合同3篇
- 二零二五年度辦公用品及家具優(yōu)先采購合同2篇
- 2024年電子商務(wù)平臺銷售代理合同版B版
- 二零二五年度婚前財產(chǎn)保護(hù)及離婚權(quán)益保障合同15篇
- 工會上墻制度
- 與信仰對話 課件-2024年入團(tuán)積極分子培訓(xùn)
- 中學(xué)美術(shù)《剪紙藝術(shù)》完整課件
- 國家職業(yè)技術(shù)技能標(biāo)準(zhǔn) X4-07-99-10 禮儀主持人(試行)勞社廳發(fā)200633號
- 第2章-變壓器的基本作用原理與理論分析
- 施工現(xiàn)場預(yù)防坍塌、高處墜落事故專項整治工作總結(jié)
- 醫(yī)院感染暴發(fā)及處理課件
- 小學(xué)五年級體育教案全冊(人教版)
- 教科版(2024秋)六年級上冊1.各種形式的能量 教案
- 二年級數(shù)學(xué)看錯數(shù)字問題專項練習(xí)
- 安全員崗位競聘課件
評論
0/150
提交評論