下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、文檔來源為 :從網(wǎng)絡收集整理 .word 版本可編輯 .歡迎下載支持 The information in this article applies to: - Microsoft Visual C+ 6.0,SP5 結構或大內(nèi)存塊打包的辦法 (上 1.1) Revision History: Version Date Creator Description 2004-2-23 鄭昀 草稿 Implementation Scope: 繼續(xù)閱讀之前,我們假設您熟悉以下知識: n SAFEARRAY n ISTREAM n Microsoft MSMQ 目錄: 1:概述 2:借用 SAFEARRA
2、Y 打包把結構寫入 MSMQ 隊列 3:借用 IStream 流打包傳遞數(shù)據(jù)到 MSMQ 隊列 1.概述 通常我們建議通過 MSMQ 傳遞基于 XML 的字符串,但有時候也需要傳遞一些結構或者一些接 口指針,那么如何打包傳遞呢? 這實際上可以轉(zhuǎn)換為一個普適問題: 如何把一個結構體(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); 如果我們想把結構作為消息的 Body 寫入 MSMQ 消息隊列,我們需要把我們的結構、大內(nèi)存塊 或接口指針轉(zhuǎn)換為 _variant_t。 2.借用 SAFEARRAY 打包把結構寫入 MSMQ 隊列 把一個結構體打包為 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篇了,希望諒解。 結構或大內(nèi)存塊打包的辦法(上 1.2 ) 上 2 篇繼續(xù)介紹如何讀取這樣的 MSMQ 消息。 結構或大內(nèi)存塊打包的辦法(上 2) 中、下篇將介紹“借用 IStream 流打包傳遞數(shù)據(jù)到 MSMQ 隊列”。 結構或大內(nèi)存塊打包的辦法(中) 結構或大內(nèi)存塊打包的辦法(下) 、 、 結構或大內(nèi)存塊打包的辦法(上 1.2) Revision History: Version Date Creator Description 2004-2-23 鄭昀 草稿 2.借用 SAFEARRAY 打包把結構寫入 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 代表非負整形的變量類型, 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)存復制到 pbData CopyMemory(pb
8、Data, pData, sizeof(*pData); / 設置 var 的類型為數(shù)組 var.vt = VT_ARRAY|VT_UI1; / 將 var 和我們的單維 SAFEARRAY 拉上關系: var.parray = lpsa; if (pbData) /相應用來釋放數(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); 這樣,就可以成功地把一個結
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單次配送合同范例
- 天府新區(qū)信息職業(yè)學院《納米集成電路制造概論》2023-2024學年第一學期期末試卷
- 天府新區(qū)信息職業(yè)學院《計算機程序設計基礎》2023-2024學年第一學期期末試卷
- 加盟保險合同范例
- 協(xié)議車轉(zhuǎn)讓合同范例
- 房屋轉(zhuǎn)讓三方合同范例
- 晨光文具合同范例
- 電力建設服務合同范例
- 2024《整治形式主義為基層減負若干規(guī)定》全文課件
- 常用統(tǒng)計軟件應用智慧樹知到期末考試答案章節(jié)答案2024年揚州大學
- 英語演講稿——Healthy Lifestyle
- 法院立案送達地址確認書
- 電氣設備拆除工程施工方案
- GB_T 20981-2021 面包質(zhì)量通則(高清-現(xiàn)行)
- 企業(yè)標準化管理辦法
- 1000MW汽輪機控制保護系統(tǒng)(介紹)
- 醫(yī)療設備維修申請報告(共2頁)
- 大功率用電器檢查表
- 淺論提高森林生產(chǎn)力的實現(xiàn)途徑
評論
0/150
提交評論