关于DDE的API函数使用?DDEGETDATA怎么用,给个例子!

springRainyao 2002-04-24 10:47:33
我在做一个取FIX DMDDE数据的工程,用到DDEGETDATA的时候变量怎么都设不好!哪位有这个API函数例子的请贴出来。先谢了!
详见:http://www.csdn.net/expert/topic/657/657449.xml?temp=.3066828
...全文
293 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
springRainyao 2002-04-29
  • 打赏
  • 举报
回复
多谢wjying(葡萄)兄,用TEXTBOX我可以做出来,但因为看到有用DELPHI&API搞定的,所以也想用API搞定,再次谢谢了!!!
jett 2002-04-29
  • 打赏
  • 举报
回复
使用DDE技术为应用程序增辉下

Private Sub LinkAndSendMessage(ByVal Msg As String)
Dim t As Long
picDDE.LinkMode = 0 注释:--
picDDE.LinkTopic = "P1|FormDDE" 注释: |______连接DDE程序并发送数据/参数
picDDE.LinkMode = 2 注释: | “|”为管道符,是“退格键”旁边的竖线,
picDDE.LinkExecute Msg 注释:-- 不是字母或数字!

t = picDDE.LinkTimeout 注释:--
picDDE.LinkTimeout = 1 注释: |______终止DDE通道。当然,也可以用别的方法
picDDE.LinkMode = 0 注释: | 这里用的是超时强制终止的方法
picDDE.LinkTimeout = t 注释:--
End Sub


Private Sub Form_Load()
If App.PrevInstance Then 注释: 程序是否已经运行

Me.LinkTopic = "" 注释: 这两行用于清除新运行的程序的DDE服务器属性,
Me.LinkMode = 0 注释: 否则在连接DDE程序时会出乱子的

LinkAndSendMessage "Max" 注释:--
LinkAndSendMessage "Count" 注释: |-----连接DDE接受程序并传送数据/参数
LinkAndSendMessage "ShowTime" 注释:--

If Command <> "" Then 注释: 如果有命令行参数,就传递过去
LinkAndSendMessage COMMANDLINE + Command
End If
End 注释: 结束新程序的运行
End If
End Sub


测试一下:
把工程“P1”编译成EXE文件(设名称为 P1.EXE )
1、打开“我的电脑”,找到 P1.EXE 并执行。可以看到程序正常运行了。
2、再运行一次,这次新程序没有运行成功,而原来运行的程序却被最大化了,而且文本框中有以下
字符:

窗体已被最大化
你已经第 1次重复调用这个程序。
但怕您不多给工资,所以只运行了一个 ^_^
最后一次运行这个程序的时间是:00-2-6 7:11:01

3、打开 MS-DOS方式 ,用命令行方式再次运行程序,如 “P1 How Are You?”
这时原来运行的程序文本框中又多了几行字:

窗体已被最大化
你已经第 2次重复调用这个程序。
但怕您不多给工资,所以只运行了一个 ^_^
最后一次运行这个程序的时间是:00-2-6 7:14:32
新程序曾以命令行形式运行
命令行为:
How Are You?

OK,运行完全正确,然后你就可以把它应用的你的程序中了。

当然,这只是一些个人心得,如有疏漏之出,还请各位大虾指正。


以上代码来自: 源代码数据库(SourceDataBase)
当前版本: 1.0.543
作者: Shawls
个人主页: Http://Shawls.Yeah.Net
E-Mail: ShawFile@163.Net
QQ: 9181729
jett 2002-04-29
  • 打赏
  • 举报
回复
一定要用api吗?

使用DDE技术为应用程序增辉上

上网的朋友一定都用过网络蚂蚁(Net Ants)的吧?不知你在使用过程中有没有注意过,
那就是如果你想调动两个“蚂蚁”为您效力是不可能的——它总会把新运行的关闭。

而“蚂蚁”程序的妙处就在于:在重复运行“蚂蚁”时它不仅拒绝运行,而且能把已经运
行的“蚂蚁”激活,这样用上面的程序就无能为力了。但事实上实现拒绝运行并激活已运行的
程序有多种方法:

1、用FindWindow函数得到已经运行窗体的句柄(HWND),然后用SetActiveWindow等API函
数将其激活。其缺点也很明显,那就是没法传递参数。

2、用FindWindow函数得到已运行窗体的句柄后用SendMessage的方法给窗体传送一个自定义
消息(附带参数),然后在窗体中拦截并进行处理,但这样做要修改窗体的标准消息处理
程序,用在VC,BC或DELPHI编写的程序中还行,但在VB中工作量太大,并且容易发生“一
般保护行错误”使VB崩溃,不太可取(当然,如果你有足够的信心和不怕崩溃的精神,也
可以试一下 ^_^ )。

3、使用DDE技术。

所谓DDE技术,就是动态数据交换技术。也许你很奇怪,这与本文所讨论的内容有什么相干的?
且听我慢慢讲来。
为了实现拒绝运行并把已经运行的程序激活并实现各种功能,我们可以先用本文开头提到的方
法,检测一下程序有没有被运行过,如果没有,就正常运行,如果已经被运行过,就打通与它的
DDE通道,传给它一个(或一些)数据,然后由已经运行的程序对数据进行处理,再去实现各种
“意想不到”的功能,这时也许就有人对这你的程序喊:“酷、酷……” ^_^
好了,耳听为虚,眼见为实,下面让我们动点真格的。

打开VB,新建一个工程,选择菜单中的“工程->工程1 属性”,把工程名称改为“P1”(我爱
偷懒,能短则短 ^_^ ),把已有的一个窗体的“LinkTopic”属性改为“FormDDE”,把“LinkMode”
属性改为“1 - Source”,添加一个PictureBox控件作为DDE执行控件,命名为picDDE。然后添加一个
TextBox控件,命名为“txtInfo”,并把“MultiLine”属性设置为“True”,以便显示多行文本,作为
消息显示控件。

最后在窗体代码区输入以下代码:


Const COMMANDLINE = "CommandLine=" 注释: 还是为了省事,定义一个常量

Private Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
Static lngCount As Long
Dim Info As String

Info = txtInfo.Text 注释: 保留原有信息

Select Case CmdStr 注释: CmdStr 是DDE程序传送过来的参数
Case "Max"
Me.WindowState = 2
Info = Info + vbNewLine + "窗体已被最大化"
Case "ShowTime"
Info = Info + vbNewLine + "最后一次运行这个程序的时间是:" + Str(Now)
Case "Count"
lngCount = lngCount + 1
Info = Info + vbNewLine + "你已经第" + Str(lngCount) + "次重复调用这个程序。" _
+ vbNewLine + "但怕您不多给工资,所以只运行了一个 ^_^"
End Select

If Left(CmdStr, Len(COMMANDLINE)) = COMMANDLINE Then
Info = Info + vbNewLine + "新程序曾以命令行形式运行" + vbNewLine + "命令行为:" _
+ vbNewLine + Right(CmdStr, Len(CmdStr) - Len(COMMANDLINE))
End If

txtInfo.Text = Info 注释: 把信息显示出来

Cancel = False
End Sub





以上代码来自: 源代码数据库(SourceDataBase)
当前版本: 1.0.543
作者: Shawls
个人主页: Http://Shawls.Yeah.Net
E-Mail: ShawFile@163.Net
QQ: 9181729
springRainyao 2002-04-28
  • 打赏
  • 举报
回复
发哥(还是呆哥):
这例子我已经有了,而且也经可以得到HANDLE了,可是DDEGETDATA这个用不了,主要是LPBYTE类型的指针没见过,我又不会VC++,所以看完MSDN上的VC++的例子还是做不出来,如果可以的话,请把DDE.C中关于DDEGETDATA函数的这段翻译成VB的,
分可以加的,开个价行了:)
sonicdater 2002-04-27
  • 打赏
  • 举报
回复
'This application shows you how to use DDE to create a better PrevInstance-function.
'Compile this sample and start it two times
'The first instance minimizes itself and when the second instance is started, it will
'send a message to the first instance to maximize itself.

'in a module
Public Const VBServerName = "TestServer"
Public Const VBTopicName = "SHOW_YOUR_MAIN_WINDOW"
Public Const XCLASS_BOOL = &H1000
Public Const XTYPF_NOBLOCK = &H2 ' CBR_BLOCK will not work
Public Const XTYP_CONNECT = &H60 Or XCLASS_BOOL Or XTYPF_NOBLOCK
Public Const CP_WINANSI = 1004 ' default codepage for windows & old DDE convs.
Public Const SW_RESTORE = 9
Public Const DDE_FACK = &H8000
Public Const XCLASS_FLAGS = &H4000
Public Const XTYP_EXECUTE = &H50 Or XCLASS_FLAGS
Public Const DNS_REGISTER = &H1
Public Const DNS_UNREGISTER = &H2
Public Declare Function DdeInitialize Lib "user32" Alias "DdeInitializeA" (pidInst As Long, ByVal pfnCallback As Long, ByVal afCmd As Long, ByVal ulRes As Long) As Integer
Public Declare Function DdeCreateStringHandle Lib "user32" Alias "DdeCreateStringHandleA" (ByVal idInst As Long, ByVal psz As String, ByVal iCodePage As Long) As Long
Public Declare Function DdeConnect Lib "user32" (ByVal idInst As Long, ByVal hszService As Long, ByVal hszTopic As Long, pCC As Any) As Long
Public Declare Function DdeNameService Lib "user32" (ByVal idInst As Long, ByVal hsz1 As Long, ByVal hsz2 As Long, ByVal afCmd As Long) As Long
Public Declare Function DdeFreeStringHandle Lib "user32" (ByVal idInst As Long, ByVal hsz As Long) As Long
Public Declare Function DdeQueryString Lib "user32" Alias "DdeQueryStringA" (ByVal idInst As Long, ByVal hsz As Long, ByVal psz As String, ByVal cchMax As Long, ByVal iCodePage As Long) As Long
Public Declare Function DdeUninitialize Lib "user32" (ByVal idInst As Long) As Long
Function DdeCllback(ByVal uType As Long, ByVal uFmt As Long, ByVal hConv As Long, ByVal hszTopic As Long, ByVal hszItem As Long, ByVal hData As Long, ByVal dwData1 As Long, ByVal dwData2 As Long) As Long
DdeCllback = Form1.AppDdeCallback(uType, uFmt, hConv, hszTopic, hszItem, hData, dwData1, dwData2)
End Function
'in a form
Dim isRun As Boolean, idInst As Long, hszVBServer As Long, hszVBTopic As Long
Dim hconvVBServer As Long, dderesult As Long
Private Sub Form_Load()
'KPD-Team 2000
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
If DdeInitialize(idInst, AddressOf DdeCllback, 0, 0) Then Exit Sub
hszVBServer = DdeCreateStringHandle(idInst, VBServerName, CP_WINANSI)
hszVBTopic = DdeCreateStringHandle(idInst, VBTopicName, CP_WINANSI)
'try to find the first instance
hconvVBServer = DdeConnect(idInst, hszVBServer, hszVBTopic, ByVal 0&)
If hconvVBServer Then
Unload Me
Exit Sub
End If
DdeNameService idInst, hszVBServer, 0, DNS_REGISTER
Me.WindowState = vbMinimized
End Sub
Private Sub Form_Unload(Cancel As Integer)
DdeFreeStringHandle idInst, hszVBServer
DdeFreeStringHandle idInst, hszVBTopic
'only unregister the DDE server for first instance
If isRun Then
If DdeNameService(idInst, hszVBServer, 0, DNS_UNREGISTER) Then
MsgBox "in ServiceUnRegister", vbOKOnly, "Error"
End If
End If
DdeUninitialize idInst
End Sub
Function AppDdeCallback(ByVal wType As Long, ByVal wFmt As Long, ByVal hConv As Long, ByVal hszTopic As Long, ByVal hszItem As Long, ByVal hData As Long, ByVal lData1 As Long, ByVal lData2 As Long) As Long
Dim iCount As Long, Buffers As String, Ret As Long
Select Case wType
Case XTYP_CONNECT
iCount = DdeQueryString(idInst, hszTopic, vbNullString, 0, CP_WINANSI)
Buffers = Space(iCount)
DdeQueryString idInst, hszTopic, Buffers, iCount + 1, CP_WINANSI
If Buffers = VBTopicName Then
Me.WindowState = vbNormal
'add any code for the first instance have found the second one is launch
Ret = DDE_FACK
End If
AppDdeCallback = Ret
Case XTYP_EXECUTE
AppDdeCallback = Ret
End Select
End Function
baguijin999 2002-04-27
  • 打赏
  • 举报
回复
很是不好意思,我访问了很多的网站,我也只能找到它们的声明部分,真的不好意思,让您失望了,若什么时候我看到了会在第一时间通知您的!
baguijin999 2002-04-24
  • 打赏
  • 举报
回复
你要用那些呀?贴出来,我来给你查。
springRainyao 2002-04-24
  • 打赏
  • 举报
回复
我上的是169,没法去国外的?有国内的吗?要不然请贴出来
baguijin999 2002-04-24
  • 打赏
  • 举报
回复
你到 http://www.mvps.org/vbnet/ , 左侧的API Index 中查看一下,应该会有收获的!
springRainyao 2002-04-24
  • 打赏
  • 举报
回复
忘了说,最好有例子才看得懂,函数声明我也有,就是不会用
springRainyao 2002-04-24
  • 打赏
  • 举报
回复
DdeClientTransaction、DdeGetData、DdeGetLastError
老兄有空的话能不能发个比较完整的到我的MAIL:yaozhenxiangs@163.net

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧