如何使用.net設(shè)置ddeml?
發(fā)表時(shí)間:2024-06-10 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]dde是為了實(shí)現(xiàn)進(jìn)程間動態(tài)的數(shù)據(jù)交換,適合于兩個程序之間的數(shù)據(jù)交換頻率較大的情況,也就是交換實(shí)時(shí)數(shù)據(jù)。ddeml類庫已經(jīng)實(shí)現(xiàn)了對dde的包裝,并且操作起來很方便。本人使用的便是ddeml庫。我的任務(wù)是使用dde來將實(shí)時(shí)數(shù)據(jù)發(fā)送的excel,首先創(chuàng)建一個dde服務(wù)器(如:serv1),注冊幾個主題(...
dde是為了實(shí)現(xiàn)進(jìn)程間動態(tài)的數(shù)據(jù)交換,適合于兩個程序之間的數(shù)據(jù)交換頻率較大的情況,也就是交換實(shí)時(shí)數(shù)據(jù)。ddeml類庫已經(jīng)實(shí)現(xiàn)了對dde的包裝,并且操作起來很方便。本人使用的便是ddeml庫。
我的任務(wù)是使用dde來將實(shí)時(shí)數(shù)據(jù)發(fā)送的excel,首先創(chuàng)建一個dde服務(wù)器(如:serv1),注冊幾個主題(如: topic1)。然后打開excel,選擇一個cell單元,往里面輸入=serv1 topic1!'aaaaa',dde服務(wù)器就會進(jìn)行響應(yīng),根據(jù)主題和item讀取一個及時(shí)數(shù)據(jù),返回到當(dāng)前的單元格。這樣一來,我就可以定制一張excel表格,里面放上我想要的數(shù)據(jù),這些數(shù)據(jù)始終是最新的。
實(shí)現(xiàn)的步驟如下
1、導(dǎo)入所有所需的ddeml的api函數(shù)和常量
2、初始化dde對象
3、注冊一個服務(wù),并申請幾個主題(topic)字符串
4、編寫回調(diào)函數(shù)中的消息處理程序
5、編寫相應(yīng)消息進(jìn)行取值的部分
要實(shí)現(xiàn)這一點(diǎn),需要克服幾個技術(shù)問題
1、受委托的回調(diào)函數(shù)的使用方法
2、數(shù)據(jù)回傳到excel中的格式
3、消息處理過程
首先講述問題3,
當(dāng)用戶往excel敲進(jìn)公式時(shí),ddeserver就會有響應(yīng),它會記下用戶公式的各部分。
然后去查找實(shí)時(shí)信息,返回一個值,這個值就是要添入到當(dāng)前cell中的值。
取到值后,調(diào)用ddeml的DdePostAdvise函數(shù),它會激發(fā)回調(diào)函數(shù)的XTYP_ADVREQ消息
該消息中調(diào)用DdeCreateDataHandle函數(shù),把這個新的值放回對應(yīng)的cell中。
注意:DdePostAdvise的調(diào)用并不一定馬上觸發(fā)XTYP_ADVREQ消息,該函數(shù)內(nèi)部使用PostMessage,
而不是sendMessage,系統(tǒng)會收集一些XTYP_ADVREQ消息一并處理,這時(shí)你就要區(qū)分那個cell對應(yīng)那個值了。這個問題不難解決,你自己想辦法吧。
講述問題1,
dde初始化需要調(diào)用一個接受委托的回調(diào)函數(shù)
Public Declare Function DdeInitialize Lib "user32" Alias "DdeInitializeA" (ByRef pidInst As Integer, ByVal pfnCallback As DDECallBackDelegate, ByVal afCmd As Integer, ByVal ulRes As Integer) As Short
只要你試過一遍,就會覺得它的調(diào)用實(shí)際上很簡單,這方面的資料也很多。關(guān)鍵就是回調(diào)函數(shù)聲明的形式和定義的形式必須一致,否則將不能調(diào)用。
Private _DDECallBack As DDEML.DDECallBackDelegate = Nothing
_DDECallBack = New DDEML.DDECallBackDelegate(AddressOf DDECallBack)
Dim ddeinst As Integer
ddeinst = DDEML.DdeInitialize(g_lInstID, _DDECallBack, DDEML.APPCLASS_STANDARD, 0)
dde初始化函數(shù)被調(diào)用之后,當(dāng)前進(jìn)程就會把dde的消息添加到消息循環(huán)中,如果收到這些消息,就會調(diào)用這個回調(diào)函數(shù)DDECallBack來處理。
第2個問題
要想讓cell接受你的值,隨便傳一個字符串它是不接受的,你要使用xltable格式傳遞,當(dāng)然,如果你做的是dde客戶端,什么格式也就無所謂了。(這時(shí)我經(jīng)過大量的實(shí)驗(yàn)得到的,如果你有好辦法,就請分享一下。)
10 00 04 00 01 00 03 00
tdtTable, cb=4, rows=1, columns=3
02 00 10 00
tdtString, cb=16
04 45 61 73 74
cch=4, East (tdtString continued)
04 57 65 73 74
cch=4, West (tdtString continued)
05 4e 6f 72 74 68
cch=5, North (tdtString continued)
我的最后問題是tdtTable不能填寫多個cell,以上格式是微軟文檔中的,實(shí)際上不行,不知道為什么。把數(shù)據(jù)寫在第一個td中。