DDE_ITEMSRVDS = DdeCreateStringHandle(DDE_INST, ITEM_SRV_DS, CP_WINANSI)
DDE_ITEMSRVUSER = DdeCreateStringHandle(DDE_INST, ITEM_SRV_USER, CP_WINANSI)
DDE_ITEMSRVSRV = DdeCreateStringHandle(DDE_INST, ITEM_SRV_SRV, CP_WINANSI)
DDE_ITEMSRVPWD = DdeCreateStringHandle(DDE_INST, ITEM_SRV_PWD, CP_WINANSI)
End If
End Sub
Public Sub Free_DDE()
Dim result As Boolean
If DDE_INST <> 0 Then
DdeNameService DDE_INST, DDE_SERVICESRV, 0, DNS_UNREGISTER
DdeFreeStringHandle DDE_INST, DDE_SERVICESRV
DdeFreeStringHandle DDE_INST, DDE_TOPICSRV
DdeFreeStringHandle DDE_INST, DDE_TOPICACC
這個是我們在vb 和 VC 中的應用程序與EXCEL 透過 DDE處理數據的方法.
Public Declare Function DdeCreateDataHandle Lib "user32" (ByVal idInst As Long, pSrc As Byte, ByVal cb As Long, ByVal cbOff As Long, ByVal hszItem As Long, ByVal wFmt As Long, ByVal afCmd As Long) As Long
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 DdeUninitialize Lib "user32" (ByVal idInst As Long) As Long
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 DdeNameService Lib "user32" (ByVal idInst As Long, ByVal hsz1 As Long, ByVal hsz2 As Long, ByVal afCmd As Long) As Long
Public Declare Function DdeCmpStringHandles Lib "user32" (ByVal hsz1 As Long, ByVal hsz2 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 DdeFreeStringHandle Lib "user32" (ByVal idInst As Long, ByVal hsz As Long) As Long
Public Declare Function DdeFreeDataHandle Lib "user32" (ByVal hdata As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Const CF_TEXT = 1
Public Const DNS_REGISTER = &H1
Public Const DNS_UNREGISTER = &H2
Public Const XTYPF_NOBLOCK = &H2 ' CBR_BLOCK will not work
Public Const APPCLASS_STANDARD = &H0&
Public Const CP_WINANSI = 1004 ' default codepage for windows old DDE convs.
Public Const DMLERR_NO_ERROR = 0 ' must be 0
Public Const DMLERR_LOW_MEMORY = &H4007
Public Const XCLASS_BOOL = &H1000
Public Const XCLASS_DATA = &H2000
Public Const XCLASS_NOTIFICATION = &H8000
Public Const XTYP_DISCONNECT = (&HC0 Or XCLASS_NOTIFICATION Or XTYPF_NOBLOCK)
Public Const XTYP_UNREGISTER = (&HD0 Or XCLASS_NOTIFICATION Or XTYPF_NOBLOCK)
Public Const XTYP_CONNECT = (&H60 Or XCLASS_BOOL Or XTYPF_NOBLOCK)
Public Const XTYP_REQUEST = (&HB0 Or XCLASS_DATA)
Public DDE_SERVICESRV As Long
Public DDE_TOPICSRV As Long
Public DDE_TOPICACC As Long
Public DDE_INST As Long
Public DDE_ITEMSRVDS As Long
Public DDE_ITEMSRVSRV As Long
Public DDE_ITEMSRVUSER As Long
Public DDE_ITEMSRVPWD As Long
Public Const TOPIC_ACC = "Acc"
Public Const SERVICE_SRV = "KAL"
Public Const TOPIC_SRV = "System"
Public Const ITEM_SRV_DS = "DS"
Public Const ITEM_SRV_USER = "USER"
Public Const ITEM_SRV_SRV = "SRV"
Public Const ITEM_SRV_PWD = "PWD"
Public bData As Byte
Public bCompInfo As Byte
Public Function DDECallBack(ByVal uType As Long, ByVal uFmt As Long, ByVal hConv As Long, ByVal hsz1 As Long, ByVal hsz2 As Long, ByVal data As Long, ByVal data1 As Long, ByVal data2 As Long) As Long
On Error GoTo ERR_CODE
Dim accdat As String * 20
Dim Load_Buf As String * 256
Dim i As Integer
Dim straccdat As String
Dim p As String
Dim strSql As String
Dim period_offset As Long, period_to As Long, period_before As Long
Dim rstmp As ADODB.Recordset
Select Case uType
Case XTYP_CONNECT
DDECallBack = True
Case XTYP_UNREGISTER
DDECallBack = True
Case XTYP_REQUEST
If Not DdeCmpStringHandles(hsz1, DDE_TOPICACC) Then
DdeQueryString DDE_INST, hsz2, accdat, 15, CP_WINANSI
For i = 1 To Len(accdat)
If Mid$(accdat, i, 1) = Chr$(0) Then
Exit For
End If
straccdat = straccdat & Mid$(accdat, i, 1)
Next i
If StrComp(Mid$(straccdat, 1, 4), "DATE", vbTextCompare) = 0 Then
strSql = "SELECT " & straccdat & " FROM FINSTMT"
end if
Set rstmp = New ADODB.Recordset
rstmp.Open strSql, ConGamma
If Not (rstmp.EOF And rstmp.BOF) Then
accdat = rstmp.Fields(0) & Chr$(0)
Else
accdat = "0" & Chr$(0)
End If
rstmp.Close
Set rstmp = Nothing
CopyMemory bData, ByVal accdat, Len(accdat)
DDECallBack = DdeCreateDataHandle(DDE_INST, bData, Len(accdat), 0, DDE_TOPICACC, CF_TEXT, 0)
Exit Function
End If
p = Mid$(straccdat, 2, 1)
If IsNumeric(Mid$(p, 1, 1)) Then
period_offset = Val(p)
Else
period_offset = Asc(p) - Asc("a") + 10
End If
Set rstmp = New ADODB.Recordset
If UserInfo.CompanyCode <> "" Then
rstmp.Open "select min(P2) from FINSTMT WHERE COMPCODE='" & UserInfo.CompanyCode & "'", ConGamma
Else
rstmp.Open "select min(P2) from FINSTMT", ConGamma
End If
If Not IsNull(rstmp.Fields(0)) Then
period_to = rstmp.Fields(0)
period_before = PeriodSub(period_to, period_offset)
End If
rstmp.Close
Set rstmp = Nothing
Select Case LCase$(Mid$(straccdat, 1, 1))
Case "c"
Case "u"
Case "a"
Case "q"
Case "w"
strSql = "select round(sum(isnull(CR,0)),2) from FINSTMT where PARENT='" & UCase$(Trim$(Right$(straccdat, Len(straccdat) - 2))) & "' and PERIOD=" & period_before
End Select
CopyMemory bData, ByVal accdat, Len(accdat)
DDECallBack = DdeCreateDataHandle(DDE_INST, bData, Len(accdat), 0, DDE_TOPICACC, CF_TEXT, 0)
Exit Function
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
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 注释: 程序是否已经运行