实在感觉不好意思,因为工作忙,长时间没写什么东西了,这是我用C#
写的DDE客户端,因为.net不支持DDE,就用API函数实现,大家看看有用吗
下面是 一些API声明
using
System;
using System.Drawing;
using System.Text;
using System.Runtime.InteropServices;
/**/ //
// namspace to wrap Win32 API functions.
//
namespace Win32API {
Win32 API 结构声明例子#region Win32 API 结构声明例子
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public POINT(int xx, int yy) { x=xx; y=yy; }
public int x;
public int y;
public override string ToString()
{
String s = String.Format("({0},{1})", x, y);
return s;
}
}
[StructLayout(LayoutKind.Sequential)]
public struct SIZE
{
public SIZE(int cxx, int cyy) { cx=cxx; cy=cyy; }
public int cx;
public int cy;
public override string ToString()
{
String s = String.Format("({0},{1})", cx, cy);
return s;
}
}
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
public int Width() { return right - left; }
public int Height() { return bottom - top; }
public POINT TopLeft() { return new POINT(left,top); }
public SIZE Size() { return new SIZE(Width(), Height()); }
public override string ToString()
{
String s = String.Format("{0}x{1}", TopLeft(), Size());
return s;
}
}
#endregion
DDE所需的结构声明#region DDE所需的结构声明
[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_QUALITY_OF_SERVICE
{ // sqos
public ushort Length;
public int ImpersonationLevel; //SECURITY_IMPERSONATION_LEVEL
public int ContextTrackingMode; //SECURITY_CONTEXT_TRACKING_MODE
public bool EffectiveOnly;
}
[StructLayout(LayoutKind.Sequential)]
public struct CONVCONTEXT{
public uint cb;
public uint wFlags;
public uint wCountryID;
public int iCodePage;
public ushort dwLangID;
public ushort dwSecurity;
public SECURITY_QUALITY_OF_SERVICE qos; // client side's quality of service
}
[StructLayout(LayoutKind.Sequential)]
public struct CONVINFO
{ // ci
public ushort cb;
public ushort hUser;
public int hConvPartner;
public int hszSvcPartner;
public int hszServiceReq;
public int hszTopic;
public int hszItem;
public uint wFmt;
public uint wType;
public uint wStatus;
public uint wConvst;
public uint wLastError;
public int hConvList;
public CONVCONTEXT ConvCtxt;
public int hwnd;
public int hwndPartner;
}
//DDE回调代理
public delegate int DdeCallback(
uint uType, // transaction type
uint uFmt, // clipboard data format
int hconv, // handle to the conversation
int hsz1, // handle to a string
int hsz2, // handle to a string
int hdata, // handle to a global memory object
uint dwData1, // transaction-specific data
uint dwData2 // transaction-specific data
);
#endregion
public class Win32
{
DDE Win32 API 函数声明例子#region DDE Win32 API 函数声明例子
[DllImport("user32.dll")]
public static extern bool IsWindowVisible(int hwnd);
[DllImport("user32.dll")]
public static extern int GetWindowText(int hwnd,
StringBuilder buf, int nMaxCount);
[DllImport("user32.dll")]
public static extern int GetClassName(int hwnd,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder buf,
int nMaxCount);
[DllImport("user32.dll")]
public static extern int GetWindowRect(int hwnd, ref RECT rc);
[DllImport("user32.dll")]
// note the runtime knows how to marshal a Rectangle
public static extern int GetWindowRect(int hwnd, ref Rectangle rc);
[DllImport("user32.dll", EntryPoint="MessageBox")]
public static extern int MessageBox(int hWnd, String text, String caption, uint type);
#endregion
DDE Win32 API 函数声明#region DDE Win32 API 函数声明
/**//// <summary>
/// C#工程中使用DDE/NETDDE的API函数声明集合
/// //需要使用DDE回调代理和一些结构
/// // public delegate int DdeCallback(
/// // uint uType, // transaction type
/// // uint uFmt, // clipboard data format
/// // int hconv, // handle to the conversation
/// // int hsz1, // handle to a string
/// // int hsz2, // handle to a string
/// // int hdata, // handle to a global memory object
/// // uint dwData1, // transaction-specific data
/// // uint dwData2 // transaction-specific data
/// // );
/// </summary>
[DllImport("user32.dll", EntryPoint="DdeInitialize")]
public static extern int DdeInitialize(ref int pidInst, DdeCallback pfnCallback,int afCmd,int ulRes);
[DllImport("user32.dll", EntryPoint="DdeCreateStringHandle")]
public static extern int DdeCreateStringHandle(int idInst,string psz,int iCodePage);
[DllImport("user32.dll", EntryPoint="DdeConnect")]
public unsafe static extern int DdeConnect(int idInst,int hszService,int hszTopic, ref CONVCONTEXT pCC);
[DllImport("user32.dll", EntryPoint="DdeFreeStringHandle")]
public static extern int DdeFreeStringHandle(int idInst,int hsz);
[DllImport("user32.dll", EntryPoint="DdeClientTransaction")]
public static extern int DdeClientTransaction(Byte[] pData,int ByVal,int hConv,int hszItem,
int wFmt,int wType,uint dwTimeout,ref int pdwResult);
[DllImport("user32.dll", EntryPoint="DdeAccessData")]
public static extern int DdeAccessData(int hData,ref int pcbDataSize);
[DllImport("user32.dll", EntryPoint="DdeUnaccessData")]
public static extern int DdeUnaccessData(int hData);
[DllImport("user32.dll", EntryPoint="DdeDisconnect")]
public static extern int DdeDisconnect(int hConv);
[DllImport("user32.dll", EntryPoint="DdeGetLastError")]
public static extern int DdeGetLastError(int idInst);
[DllImport("user32.dll", EntryPoint="DdeAbandonTransaction")]
public static extern int DdeAbandonTransaction(int idInst,int hConv,int idTransaction);
[DllImport("user32.dll", EntryPoint="DdeAddData")]
public static extern int DdeAddData(int hData,byte pSrc,int cb,int cbOff);
[DllImport("user32.dll", EntryPoint="DdeCmpStringHandles")]
public static extern int DdeCmpStringHandles(int hsz1,int hsz2);
[DllImport("user32.dll", EntryPoint="DdeConnectList")]
public static extern int DdeConnectList(int idInst,int hszService,int hszTopic,int hConvList,ref CONVCONTEXT pCC);
[DllImport("user32.dll", EntryPoint="DdeCreateDataHandle")]
public static extern int DdeCreateDataHandle(int idInst,byte[] pSrc,int cb,int cbOff,
int hszItem,int wFmt,int afCmd);
[DllImport("user32.dll", EntryPoint="DdeDisconnectList")]
public static extern int DdeDisconnectList(int hConvList);
[DllImport("user32.dll", EntryPoint="DdeEnableCallback")]
public static extern int DdeEnableCallback(int idInst,int hConv,int wCmd);
[DllImport("user32.dll", EntryPoint="DdeFreeDataHandle")]
public static extern int DdeFreeDataHandle(int hData);
[DllImport("user32.dll", EntryPoint="DdeGetData")]
public static extern int DdeGetData(int hData,byte pDst,int cbMax,int cbOff);
[DllImport("user32.dll", EntryPoint="DdeImpersonateClient")]
public static extern int DdeImpersonateClient(int hConv);
[DllImport("user32.dll", EntryPoint="DdeKeepStringHandle")]
public static extern int DdeKeepStringHandle(int idInst,int hsz);
[DllImport("user32.dll", EntryPoint="DdeNameService")]
public static extern int DdeNameService(int idInst,int hsz1,int hsz2,int afCmd);
[DllImport("user32.dll", EntryPoint="DdePostAdvise")]
public static extern int DdePostAdvise(int idInst,int hszTopic,int hszItem);
[DllImport("user32.dll", EntryPoint="DdeQueryConvInfo")]
public static extern int DdeQueryConvInfo(int hConv,int idTransaction,ref CONVINFO pConvInfo);
[DllImport("user32.dll", EntryPoint="DdeQueryNextServer")]
public static extern int DdeQueryNextServer(int hConvList,int hConvPrev);
[DllImport("user32.dll", EntryPoint="DdeQueryString")]
public unsafe static extern int DdeQueryString(int idInst,int hsz,sbyte* psz,int cchMax,int iCodePage);
[DllImport("user32.dll", EntryPoint="DdeReconnect")]
public static extern int DdeReconnect(int hConv);
[DllImport("user32.dll", EntryPoint="DdeSetQualityOfService")]
public static extern int DdeSetQualityOfService(int hWndClient, ref SECURITY_QUALITY_OF_SERVICE pqosNew,ref SECURITY_QUALITY_OF_SERVICE pqosPrev);
[DllImport("user32.dll", EntryPoint="DdeSetUserHandle")]
public static extern int DdeSetUserHandle(int hConv,int id,int hUser);
[DllImport("user32.dll", EntryPoint="DdeUninitialize")]
public static extern int DdeUninitialize(int idInst);
#endregion
}
}
using System.Drawing;
using System.Text;
using System.Runtime.InteropServices;
/**/ //
// namspace to wrap Win32 API functions.
//
namespace Win32API {
Win32 API 结构声明例子#region Win32 API 结构声明例子
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public POINT(int xx, int yy) { x=xx; y=yy; }
public int x;
public int y;
public override string ToString()
{
String s = String.Format("({0},{1})", x, y);
return s;
}
}
[StructLayout(LayoutKind.Sequential)]
public struct SIZE
{
public SIZE(int cxx, int cyy) { cx=cxx; cy=cyy; }
public int cx;
public int cy;
public override string ToString()
{
String s = String.Format("({0},{1})", cx, cy);
return s;
}
}
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
public int Width() { return right - left; }
public int Height() { return bottom - top; }
public POINT TopLeft() { return new POINT(left,top); }
public SIZE Size() { return new SIZE(Width(), Height()); }
public override string ToString()
{
String s = String.Format("{0}x{1}", TopLeft(), Size());
return s;
}
}
#endregion
DDE所需的结构声明#region DDE所需的结构声明
[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_QUALITY_OF_SERVICE
{ // sqos
public ushort Length;
public int ImpersonationLevel; //SECURITY_IMPERSONATION_LEVEL
public int ContextTrackingMode; //SECURITY_CONTEXT_TRACKING_MODE
public bool EffectiveOnly;
}
[StructLayout(LayoutKind.Sequential)]
public struct CONVCONTEXT{
public uint cb;
public uint wFlags;
public uint wCountryID;
public int iCodePage;
public ushort dwLangID;
public ushort dwSecurity;
public SECURITY_QUALITY_OF_SERVICE qos; // client side's quality of service
}
[StructLayout(LayoutKind.Sequential)]
public struct CONVINFO
{ // ci
public ushort cb;
public ushort hUser;
public int hConvPartner;
public int hszSvcPartner;
public int hszServiceReq;
public int hszTopic;
public int hszItem;
public uint wFmt;
public uint wType;
public uint wStatus;
public uint wConvst;
public uint wLastError;
public int hConvList;
public CONVCONTEXT ConvCtxt;
public int hwnd;
public int hwndPartner;
}
//DDE回调代理
public delegate int DdeCallback(
uint uType, // transaction type
uint uFmt, // clipboard data format
int hconv, // handle to the conversation
int hsz1, // handle to a string
int hsz2, // handle to a string
int hdata, // handle to a global memory object
uint dwData1, // transaction-specific data
uint dwData2 // transaction-specific data
);
#endregion
public class Win32
{
DDE Win32 API 函数声明例子#region DDE Win32 API 函数声明例子
[DllImport("user32.dll")]
public static extern bool IsWindowVisible(int hwnd);
[DllImport("user32.dll")]
public static extern int GetWindowText(int hwnd,
StringBuilder buf, int nMaxCount);
[DllImport("user32.dll")]
public static extern int GetClassName(int hwnd,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder buf,
int nMaxCount);
[DllImport("user32.dll")]
public static extern int GetWindowRect(int hwnd, ref RECT rc);
[DllImport("user32.dll")]
// note the runtime knows how to marshal a Rectangle
public static extern int GetWindowRect(int hwnd, ref Rectangle rc);
[DllImport("user32.dll", EntryPoint="MessageBox")]
public static extern int MessageBox(int hWnd, String text, String caption, uint type);
#endregion
DDE Win32 API 函数声明#region DDE Win32 API 函数声明
/**//// <summary>
/// C#工程中使用DDE/NETDDE的API函数声明集合
/// //需要使用DDE回调代理和一些结构
/// // public delegate int DdeCallback(
/// // uint uType, // transaction type
/// // uint uFmt, // clipboard data format
/// // int hconv, // handle to the conversation
/// // int hsz1, // handle to a string
/// // int hsz2, // handle to a string
/// // int hdata, // handle to a global memory object
/// // uint dwData1, // transaction-specific data
/// // uint dwData2 // transaction-specific data
/// // );
/// </summary>
[DllImport("user32.dll", EntryPoint="DdeInitialize")]
public static extern int DdeInitialize(ref int pidInst, DdeCallback pfnCallback,int afCmd,int ulRes);
[DllImport("user32.dll", EntryPoint="DdeCreateStringHandle")]
public static extern int DdeCreateStringHandle(int idInst,string psz,int iCodePage);
[DllImport("user32.dll", EntryPoint="DdeConnect")]
public unsafe static extern int DdeConnect(int idInst,int hszService,int hszTopic, ref CONVCONTEXT pCC);
[DllImport("user32.dll", EntryPoint="DdeFreeStringHandle")]
public static extern int DdeFreeStringHandle(int idInst,int hsz);
[DllImport("user32.dll", EntryPoint="DdeClientTransaction")]
public static extern int DdeClientTransaction(Byte[] pData,int ByVal,int hConv,int hszItem,
int wFmt,int wType,uint dwTimeout,ref int pdwResult);
[DllImport("user32.dll", EntryPoint="DdeAccessData")]
public static extern int DdeAccessData(int hData,ref int pcbDataSize);
[DllImport("user32.dll", EntryPoint="DdeUnaccessData")]
public static extern int DdeUnaccessData(int hData);
[DllImport("user32.dll", EntryPoint="DdeDisconnect")]
public static extern int DdeDisconnect(int hConv);
[DllImport("user32.dll", EntryPoint="DdeGetLastError")]
public static extern int DdeGetLastError(int idInst);
[DllImport("user32.dll", EntryPoint="DdeAbandonTransaction")]
public static extern int DdeAbandonTransaction(int idInst,int hConv,int idTransaction);
[DllImport("user32.dll", EntryPoint="DdeAddData")]
public static extern int DdeAddData(int hData,byte pSrc,int cb,int cbOff);
[DllImport("user32.dll", EntryPoint="DdeCmpStringHandles")]
public static extern int DdeCmpStringHandles(int hsz1,int hsz2);
[DllImport("user32.dll", EntryPoint="DdeConnectList")]
public static extern int DdeConnectList(int idInst,int hszService,int hszTopic,int hConvList,ref CONVCONTEXT pCC);
[DllImport("user32.dll", EntryPoint="DdeCreateDataHandle")]
public static extern int DdeCreateDataHandle(int idInst,byte[] pSrc,int cb,int cbOff,
int hszItem,int wFmt,int afCmd);
[DllImport("user32.dll", EntryPoint="DdeDisconnectList")]
public static extern int DdeDisconnectList(int hConvList);
[DllImport("user32.dll", EntryPoint="DdeEnableCallback")]
public static extern int DdeEnableCallback(int idInst,int hConv,int wCmd);
[DllImport("user32.dll", EntryPoint="DdeFreeDataHandle")]
public static extern int DdeFreeDataHandle(int hData);
[DllImport("user32.dll", EntryPoint="DdeGetData")]
public static extern int DdeGetData(int hData,byte pDst,int cbMax,int cbOff);
[DllImport("user32.dll", EntryPoint="DdeImpersonateClient")]
public static extern int DdeImpersonateClient(int hConv);
[DllImport("user32.dll", EntryPoint="DdeKeepStringHandle")]
public static extern int DdeKeepStringHandle(int idInst,int hsz);
[DllImport("user32.dll", EntryPoint="DdeNameService")]
public static extern int DdeNameService(int idInst,int hsz1,int hsz2,int afCmd);
[DllImport("user32.dll", EntryPoint="DdePostAdvise")]
public static extern int DdePostAdvise(int idInst,int hszTopic,int hszItem);
[DllImport("user32.dll", EntryPoint="DdeQueryConvInfo")]
public static extern int DdeQueryConvInfo(int hConv,int idTransaction,ref CONVINFO pConvInfo);
[DllImport("user32.dll", EntryPoint="DdeQueryNextServer")]
public static extern int DdeQueryNextServer(int hConvList,int hConvPrev);
[DllImport("user32.dll", EntryPoint="DdeQueryString")]
public unsafe static extern int DdeQueryString(int idInst,int hsz,sbyte* psz,int cchMax,int iCodePage);
[DllImport("user32.dll", EntryPoint="DdeReconnect")]
public static extern int DdeReconnect(int hConv);
[DllImport("user32.dll", EntryPoint="DdeSetQualityOfService")]
public static extern int DdeSetQualityOfService(int hWndClient, ref SECURITY_QUALITY_OF_SERVICE pqosNew,ref SECURITY_QUALITY_OF_SERVICE pqosPrev);
[DllImport("user32.dll", EntryPoint="DdeSetUserHandle")]
public static extern int DdeSetUserHandle(int hConv,int id,int hUser);
[DllImport("user32.dll", EntryPoint="DdeUninitialize")]
public static extern int DdeUninitialize(int idInst);
#endregion
}
}
下面是客户端类:
using
System;
using Win32API;
using System.Runtime.InteropServices;
using System.Windows.Forms.Design;
using System.Collections;
using System.Timers;
using System.Text;
using System.Threading ;
namespace MWDataLog
{
/**//// <summary>
/// DdeClient 定义单个Service的单个Topic了连接
/// 支持NetDDE,连接方式为:
/// Service为“\\SERVERNODENAME\APPLICATIONNAME”
/// Topic为“TOPICNAME”
/// </summary>
public class DdeItem
{
public int ItemID;
public DdeClient Dc;
public string ItemName;
public string ItemDescription;
public string ItemValue;
public DdeItem(DdeClient iDc,int itemID,string iName,string Desc)
{
ItemName = iName;
ItemDescription=Desc;
Dc = iDc;
ItemID=itemID;
ItemValue = "";
}
}
public class DdeClient
{
DDE用常量定义#region DDE用常量定义
/**//// <summary>
/// ///
/// /***** conversation states (usState) *****/
public const uint XST_NULL = 0; /**//* quiescent states */
public const uint XST_INCOMPLETE = 1;
public const uint XST_CONNECTED = 2;
public const uint XST_INIT1 = 3; /**//* mid-initiation states */
public const uint XST_INIT2 = 4;
public const uint XST_REQSENT = 5; /**//* active conversation states */
public const uint XST_DATARCVD = 6;
public const uint XST_POKESENT = 7;
public const uint XST_POKEACKRCVD = 8;
public const uint XST_EXECSENT = 9;
public const uint XST_EXECACKRCVD = 10;
public const uint XST_ADVSENT = 11;
public const uint XST_UNADVSENT = 12;
public const uint XST_ADVACKRCVD = 13;
public const uint XST_UNADVACKRCVD = 14;
public const uint XST_ADVDATASENT = 15;
public const uint XST_ADVDATAACKRCVD = 16;
/**//* used in LOWORD(dwData1) of XTYP_ADVREQ callbacks */
public const uint CADV_LATEACK = 0xFFFF;
/**//***** conversation status bits (fsStatus) *****/
public const uint ST_CONNECTED = 0x0001;
public const uint ST_ADVISE = 0x0002;
public const uint ST_ISLOCAL = 0x0004;
public const uint ST_BLOCKED = 0x0008;
public const uint ST_CLIENT = 0x0010;
public const uint ST_TERMINATED = 0x0020;
public const uint ST_INLIST = 0x0040;
public const uint ST_BLOCKNEXT = 0x0080;
public const uint ST_ISSELF = 0x0100;
/**//* DDE constants for wStatus field */
public const uint DDE_FACK = 0x8000;
public const uint DDE_FBUSY = 0x4000;
public const uint DDE_FDEFERUPD = 0x4000;
public const uint DDE_FACKREQ = 0x8000;
public const uint DDE_FRELEASE = 0x2000;
public const uint DDE_FREQUESTED = 0x1000;
public const uint DDE_FAPPSTATUS = 0x00ff;
public const uint DDE_FNOTPROCESSED = 0x0000;
public const uint DDE_FACKRESERVED = (~(DDE_FACK | DDE_FBUSY | DDE_FAPPSTATUS));
public const uint DDE_FADVRESERVED = (~(DDE_FACKREQ | DDE_FDEFERUPD));
public const uint DDE_FDATRESERVED = (~(DDE_FACKREQ | DDE_FRELEASE | DDE_FREQUESTED));
public const uint DDE_FPOKRESERVED = (~(DDE_FRELEASE));
/**//***** message filter hook types *****/
public const uint MSGF_DDEMGR = 0x8001;
/**//***** codepage constants ****/
public const uint CP_WINANSI = 1004; /**//* default codepage for windows & old DDE convs. */
public const uint CP_WINUNICODE = 1200;
//#ifdef UNICODE
//public const uint CP_WINNEUTRAL = CP_WINUNICODE
//#else // !UNICODE
//public const uint CP_WINNEUTRAL CP_WINANSI
//#endif // !UNICODE
/**//***** transaction types *****/
public const uint XTYPF_NOBLOCK = 0x0002; /**//* CBR_BLOCK will not work */
public const uint XTYPF_NODATA = 0x0004; /**//* DDE_FDEFERUPD */
public const uint XTYPF_ACKREQ = 0x0008; /**//* DDE_FACKREQ */
public const uint XCLASS_MASK = 0xFC00;
public const uint XCLASS_BOOL = 0x1000;
public const uint XCLASS_DATA = 0x2000;
public const uint XCLASS_FLAGS = 0x4000;
public const uint XCLASS_NOTIFICATION = 0x8000;
public const uint XTYP_ERROR = (0x0000 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK );
public const uint XTYP_ADVDATA = (0x0010 | XCLASS_FLAGS );
public const uint XTYP_ADVREQ = (0x0020 | XCLASS_DATA | XTYPF_NOBLOCK );
public const uint XTYP_ADVSTART = (0x0030 | XCLASS_BOOL );
public const uint XTYP_ADVSTOP = (0x0040 | XCLASS_NOTIFICATION);
public const uint XTYP_EXECUTE = (0x0050 | XCLASS_FLAGS );
public const uint XTYP_CONNECT = (0x0060 | XCLASS_BOOL | XTYPF_NOBLOCK);
public const uint XTYP_CONNECT_CONFIRM = (0x0070 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK);
public const uint XTYP_XACT_COMPLETE = (0x0080 | XCLASS_NOTIFICATION );
public const uint XTYP_POKE = (0x0090 | XCLASS_FLAGS );
public const uint XTYP_REGISTER = (0x00A0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK);
public const uint XTYP_REQUEST = (0x00B0 | XCLASS_DATA );
public const uint XTYP_DISCONNECT = (0x00C0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK);
public const uint XTYP_UNREGISTER = (0x00D0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK);
public const uint XTYP_WILDCONNECT = (0x00E0 | XCLASS_DATA | XTYPF_NOBLOCK);
public const uint XTYP_MASK = 0x00F0;
public const uint XTYP_SHIFT = 4 ; /**//* shift to turn XTYP_ uinto an index */
/**//***** Timeout constants *****/
public const uint TIMEOUT_ASYNC = 0xFFFFFFFF;
/**//***** Transaction ID constants *****/
public const uint QID_SYNC = 0x7FFFFFFF;
public const uint DMLERR_NO_ERROR = 0; /**//* must be 0 */
public const uint DMLERR_FIRST = 0x4000;
public const uint DMLERR_ADVACKTIMEOUT = 0x4000;
public const uint DMLERR_BUSY = 0x4001;
public const uint DMLERR_DATAACKTIMEOUT = 0x4002;
public const uint DMLERR_DLL_NOT_INITIALIZED = 0x4003;
public const uint DMLERR_DLL_USAGE = 0x4004;
public const uint DMLERR_EXECACKTIMEOUT = 0x4005;
public const uint DMLERR_INVALIDPARAMETER = 0x4006;
public const uint DMLERR_LOW_MEMORY = 0x4007;
public const uint DMLERR_MEMORY_ERROR = 0x4008;
public const uint DMLERR_NOTPROCESSED = 0x4009;
public const uint DMLERR_NO_CONV_ESTABLISHED = 0x400a;
public const uint DMLERR_POKEACKTIMEOUT = 0x400b;
public const uint DMLERR_POSTMSG_FAILED = 0x400c;
public const uint DMLERR_REENTRANCY = 0x400d;
public const uint DMLERR_SERVER_DIED = 0x400e;
public const uint DMLERR_SYS_ERROR = 0x400f;
public const uint DMLERR_UNADVACKTIMEOUT = 0x4010;
public const uint DMLERR_UNFOUND_QUEUE_ID = 0x4011;
public const uint DMLERR_LAST = 0x4011;
public const uint EC_ENABLEALL = 0;
public const uint EC_ENABLEONE = ST_BLOCKNEXT;
public const uint EC_DISABLE = ST_BLOCKED;
public const uint EC_QUERYWAITING = 2;
/**//// </summary>
#endregion
private int dwDDEInst; // DDE Instance value
private int hconvCurrent;
private string lpszService;
private string lpszTopic;
private ArrayList alDdeItemList;
private Win32API.DdeCallback myCallback;
private System.Timers.Timer theTimer;//检查连接的计时器
private bool bConnected;
private bool bAutoConnect;
public string LinkName;
public string LinkDesc;
public string Service
{
get{return lpszService; }
set{lpszService=value; }
}
public string Topic
{
get{return lpszTopic;}
set{lpszTopic=value;}
}
public ArrayList ItemList
{
get{return alDdeItemList;}
set{alDdeItemList=value;}
}
public bool Connected
{
get{return bConnected;}
set{bConnected=value;}
}
public bool AutoConnect
{
get{return bAutoConnect;}
set{bAutoConnect=value;}
}
public DdeClient(string theService,string theTopic,string Desc)
{
dwDDEInst=0;
hconvCurrent = 0;
lpszService=theService;
lpszTopic=theTopic;
alDdeItemList=new ArrayList();
myCallback = new Win32API.DdeCallback(DdeClientCallback);
bConnected=false;
LinkName = theService+"|"+theTopic;
LinkDesc = Desc;
theTimer = new System.Timers.Timer(2000);
theTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
theTimer.AutoReset = true;
theTimer.Enabled = false;//暂时不用---设为false
}
public override string ToString()
{
return Service+"|"+Topic;
}
public bool Initialize()
{
int iInitResult=0;
iInitResult = Win32.DdeInitialize(ref dwDDEInst, myCallback,
(int)0x3f000,0);//CBF_FAIL_ALLSVRXACTIONS=0x3f000
if(iInitResult==0)return true;
else return false;
}
//
//
private unsafe int DdeClientCallback(
uint uType, // transaction type
uint uFmt, // clipboard data format
int hconv, // handle to the conversation
int hsz1, // handle to a string
int hsz2, // handle to a string
int hdata, // handle to a global memory object
uint dwData1, // transaction-specific data
uint dwData2) // transaction-specific data
{
int dwLength=0;
try
{
switch (uType)
{
case 0x4010://XTYP_ADVDATA:
try
{
sbyte* pData = (sbyte *)Win32.DdeAccessData(hdata, ref dwLength);
if((pData!=null) && (dwLength != 0))
{
sbyte* pSZ=stackalloc sbyte[30];
Win32.DdeQueryString(dwDDEInst,hsz2,pSZ,28,(int)CP_WINANSI);
if(ItemList.Count>0)
{
for(int i=0;i<ItemList.Count;i++)
{
string tmpSZ=new string(pSZ);
if(((DdeItem)ItemList[i]).ItemName.ToUpper()==tmpSZ.ToUpper())
{
string tmpData = new string(pData,0,dwLength);
((DdeItem)ItemList[i]).ItemValue=tmpData;
}
}
}
}
}
catch{}
finally
{
if(hdata!=0)Win32.DdeUnaccessData(hdata);
}
break;
case 0x80C2://XTYP_DISCONNECT:
Connected = false;
break;
default:
break;
}
}
catch
{
//
}
finally
{
}
return (int)DDE_FACK;
}
//当前没起作用
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
theTimer.Enabled = false;
if(!Connected)
{
if(AutoConnect)
{
ReEstablishLink();
}
}
theTimer.Enabled = true;
}
/**//*
//当前的Server是否可用(待测试)
private bool IsServiceAvailable(string lpszService)
{
int hszService;
int hConv;
hszService = Win32.DdeCreateStringHandle(dwDDEInst,lpszService,(int)CP_WINANSI);
//
// Try to connect to any topic
//
Win32API.CONVCONTEXT cc=new CONVCONTEXT();
hConv = Win32.DdeConnect(dwDDEInst,hszService,0,ref cc);
// Free the HSZs now
Win32.DdeFreeStringHandle(dwDDEInst, hszService);
if(hConv!=0)
{
Win32.DdeDisconnect(hConv);
return true;
}
return false;
}
*/
// [10/24/2003]
//建立连接
public unsafe bool EstablishLink()
{
int hConv=0;
int hszService, hszTopic;
Demolish();//如果是第一次,则什么也不做
Initialize();
// Connect to the server
hszTopic = Win32.DdeCreateStringHandle(dwDDEInst,lpszTopic,(int)CP_WINANSI);
hszService = Win32.DdeCreateStringHandle(dwDDEInst,lpszService,(int)CP_WINANSI);
Win32API.CONVCONTEXT cc=new CONVCONTEXT();
cc.cb=(uint)sizeof(Win32API.CONVCONTEXT);
hConv = Win32.DdeConnect(dwDDEInst,hszService,hszTopic,ref cc);
int DdeErrcode=Win32.DdeGetLastError(dwDDEInst);
Win32.DdeFreeStringHandle(dwDDEInst, hszTopic);
Win32.DdeFreeStringHandle(dwDDEInst, hszService);
if (hConv!=0)
{
if(hconvCurrent!=0)
{
Win32.DdeDisconnect(hconvCurrent);
}
hconvCurrent = hConv;
Connected = true;
return true;
}
else
{
Connected = false;
return false;
}
}
//销毁连接
public unsafe void Demolish()
{
if(dwDDEInst!=0)
{
Win32.DdeUninitialize(dwDDEInst);
dwDDEInst=0;
}
if(hconvCurrent!=0)
{
Win32.DdeDisconnect(hconvCurrent);
hconvCurrent=0;
}
}
//建立连接
public unsafe bool ReEstablishLink()
{
bool Elr=EstablishLink();
if (Elr)
{
Connected = true;
foreach(DdeItem item in ItemList)
{
TransactItem(item);
}
return true;
}
else
{
Connected = false;
return false;
}
}
// [10/24/2003]
//与Server建立Hoot连接
public unsafe bool TransactItem(DdeItem item)
{
int hszItem=0;
int dwResult=0;
int hDDEData=0;
if(item==null)return false;
if((hconvCurrent!=0) && item.ItemName !="")
{
hszItem = Win32.DdeCreateStringHandle(dwDDEInst,item.ItemName,(int)CP_WINANSI);
hDDEData = Win32.DdeClientTransaction(null,
0,
hconvCurrent,
hszItem,
1,//CF_TEXT,
(int)XTYP_ADVSTART,
TIMEOUT_ASYNC, // ms timeout
ref dwResult);
Win32.DdeFreeStringHandle(dwDDEInst, hszItem);
if(hDDEData!=0)
{
try
{
int dwLength=0;
sbyte* pData = (sbyte *)Win32.DdeAccessData(hDDEData, ref dwLength);
if((pData!=null) && (dwLength != 0))
{
string tmpData = new string(pData,0,dwLength);
item.ItemValue=tmpData;
}
}
catch{}
finally
{
Win32.DdeUnaccessData(hDDEData);
}
return true;
}
else
{
return false;
}
}
else
return false;
}
//必须设置item.ItemName和item.ItemValue后调用
public unsafe bool PokeItem(DdeItem item)
{
int hszItem=0;
int dwResult=0;
int hDDEData=0;
if(item==null)return false;
if((hconvCurrent!=0) && item.ItemName !="")
{
hszItem = Win32.DdeCreateStringHandle(dwDDEInst,item.ItemName,(int)CP_WINANSI);
//int errcode=Win32.DdeGetLastError(dwDDEInst);
ASCIIEncoding AE = new ASCIIEncoding();
byte[] ByteArray = AE.GetBytes(item.ItemValue);
int hd = Win32.DdeCreateDataHandle(dwDDEInst,ByteArray,ByteArray.Length,0,hszItem,1,0);
hDDEData = Win32.DdeClientTransaction(
ByteArray,ByteArray.Length,
hconvCurrent,hszItem,
1,//CF_TEXT,
(int)XTYP_POKE ,
0xFFFFFFFF, // ms timeout
ref dwResult);
Win32.DdeFreeStringHandle(dwDDEInst, hszItem);
if(hDDEData!=0)
{
return true;
}
else
{
return false;
}
}
else
return false;
}
public void PollRequestItem()
{
if(ItemList.Count>0)
{
for(int i=0;i<ItemList.Count;i++)
{
RequestItem((DdeItem)ItemList[i]);
}
}
}
// [10/24/2003]
//主动请求Item的值
public unsafe string RequestItem(DdeItem item)
{
int hszItem=0;
int dwResult=0;
int hDDEData=0;
int dwLength=0;
if(item==null)
{
item.ItemValue="";
return "";
}
if((hconvCurrent!=0) && item.ItemName !="")
{
hszItem = Win32.DdeCreateStringHandle(dwDDEInst,item.ItemName,(int)CP_WINANSI);
hDDEData = Win32.DdeClientTransaction(null,
0,
hconvCurrent,
hszItem,
1,//CF_TEXT,
(int)XTYP_REQUEST,
5000, // ms timeout
ref dwResult);
Win32.DdeFreeStringHandle(dwDDEInst, hszItem);
if(hDDEData!=0)
{
sbyte* pData = (sbyte *)Win32.DdeAccessData(hDDEData, ref dwLength);
{
if((pData!=null) && (dwLength != 0))
{
string tmpData = new string(pData,0,dwLength);
item.ItemValue=tmpData;
return tmpData;
}
else
{
item.ItemValue="";
return "";
}
}
}
else
{
item.ItemValue="";
return "";
}
}
else
{
item.ItemValue="";
return "";
}
}
//
}
}
using Win32API;
using System.Runtime.InteropServices;
using System.Windows.Forms.Design;
using System.Collections;
using System.Timers;
using System.Text;
using System.Threading ;
namespace MWDataLog
{
/**//// <summary>
/// DdeClient 定义单个Service的单个Topic了连接
/// 支持NetDDE,连接方式为:
/// Service为“\\SERVERNODENAME\APPLICATIONNAME”
/// Topic为“TOPICNAME”
/// </summary>
public class DdeItem
{
public int ItemID;
public DdeClient Dc;
public string ItemName;
public string ItemDescription;
public string ItemValue;
public DdeItem(DdeClient iDc,int itemID,string iName,string Desc)
{
ItemName = iName;
ItemDescription=Desc;
Dc = iDc;
ItemID=itemID;
ItemValue = "";
}
}
public class DdeClient
{
DDE用常量定义#region DDE用常量定义
/**//// <summary>
/// ///
/// /***** conversation states (usState) *****/
public const uint XST_NULL = 0; /**//* quiescent states */
public const uint XST_INCOMPLETE = 1;
public const uint XST_CONNECTED = 2;
public const uint XST_INIT1 = 3; /**//* mid-initiation states */
public const uint XST_INIT2 = 4;
public const uint XST_REQSENT = 5; /**//* active conversation states */
public const uint XST_DATARCVD = 6;
public const uint XST_POKESENT = 7;
public const uint XST_POKEACKRCVD = 8;
public const uint XST_EXECSENT = 9;
public const uint XST_EXECACKRCVD = 10;
public const uint XST_ADVSENT = 11;
public const uint XST_UNADVSENT = 12;
public const uint XST_ADVACKRCVD = 13;
public const uint XST_UNADVACKRCVD = 14;
public const uint XST_ADVDATASENT = 15;
public const uint XST_ADVDATAACKRCVD = 16;
/**//* used in LOWORD(dwData1) of XTYP_ADVREQ callbacks */
public const uint CADV_LATEACK = 0xFFFF;
/**//***** conversation status bits (fsStatus) *****/
public const uint ST_CONNECTED = 0x0001;
public const uint ST_ADVISE = 0x0002;
public const uint ST_ISLOCAL = 0x0004;
public const uint ST_BLOCKED = 0x0008;
public const uint ST_CLIENT = 0x0010;
public const uint ST_TERMINATED = 0x0020;
public const uint ST_INLIST = 0x0040;
public const uint ST_BLOCKNEXT = 0x0080;
public const uint ST_ISSELF = 0x0100;
/**//* DDE constants for wStatus field */
public const uint DDE_FACK = 0x8000;
public const uint DDE_FBUSY = 0x4000;
public const uint DDE_FDEFERUPD = 0x4000;
public const uint DDE_FACKREQ = 0x8000;
public const uint DDE_FRELEASE = 0x2000;
public const uint DDE_FREQUESTED = 0x1000;
public const uint DDE_FAPPSTATUS = 0x00ff;
public const uint DDE_FNOTPROCESSED = 0x0000;
public const uint DDE_FACKRESERVED = (~(DDE_FACK | DDE_FBUSY | DDE_FAPPSTATUS));
public const uint DDE_FADVRESERVED = (~(DDE_FACKREQ | DDE_FDEFERUPD));
public const uint DDE_FDATRESERVED = (~(DDE_FACKREQ | DDE_FRELEASE | DDE_FREQUESTED));
public const uint DDE_FPOKRESERVED = (~(DDE_FRELEASE));
/**//***** message filter hook types *****/
public const uint MSGF_DDEMGR = 0x8001;
/**//***** codepage constants ****/
public const uint CP_WINANSI = 1004; /**//* default codepage for windows & old DDE convs. */
public const uint CP_WINUNICODE = 1200;
//#ifdef UNICODE
//public const uint CP_WINNEUTRAL = CP_WINUNICODE
//#else // !UNICODE
//public const uint CP_WINNEUTRAL CP_WINANSI
//#endif // !UNICODE
/**//***** transaction types *****/
public const uint XTYPF_NOBLOCK = 0x0002; /**//* CBR_BLOCK will not work */
public const uint XTYPF_NODATA = 0x0004; /**//* DDE_FDEFERUPD */
public const uint XTYPF_ACKREQ = 0x0008; /**//* DDE_FACKREQ */
public const uint XCLASS_MASK = 0xFC00;
public const uint XCLASS_BOOL = 0x1000;
public const uint XCLASS_DATA = 0x2000;
public const uint XCLASS_FLAGS = 0x4000;
public const uint XCLASS_NOTIFICATION = 0x8000;
public const uint XTYP_ERROR = (0x0000 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK );
public const uint XTYP_ADVDATA = (0x0010 | XCLASS_FLAGS );
public const uint XTYP_ADVREQ = (0x0020 | XCLASS_DATA | XTYPF_NOBLOCK );
public const uint XTYP_ADVSTART = (0x0030 | XCLASS_BOOL );
public const uint XTYP_ADVSTOP = (0x0040 | XCLASS_NOTIFICATION);
public const uint XTYP_EXECUTE = (0x0050 | XCLASS_FLAGS );
public const uint XTYP_CONNECT = (0x0060 | XCLASS_BOOL | XTYPF_NOBLOCK);
public const uint XTYP_CONNECT_CONFIRM = (0x0070 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK);
public const uint XTYP_XACT_COMPLETE = (0x0080 | XCLASS_NOTIFICATION );
public const uint XTYP_POKE = (0x0090 | XCLASS_FLAGS );
public const uint XTYP_REGISTER = (0x00A0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK);
public const uint XTYP_REQUEST = (0x00B0 | XCLASS_DATA );
public const uint XTYP_DISCONNECT = (0x00C0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK);
public const uint XTYP_UNREGISTER = (0x00D0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK);
public const uint XTYP_WILDCONNECT = (0x00E0 | XCLASS_DATA | XTYPF_NOBLOCK);
public const uint XTYP_MASK = 0x00F0;
public const uint XTYP_SHIFT = 4 ; /**//* shift to turn XTYP_ uinto an index */
/**//***** Timeout constants *****/
public const uint TIMEOUT_ASYNC = 0xFFFFFFFF;
/**//***** Transaction ID constants *****/
public const uint QID_SYNC = 0x7FFFFFFF;
public const uint DMLERR_NO_ERROR = 0; /**//* must be 0 */
public const uint DMLERR_FIRST = 0x4000;
public const uint DMLERR_ADVACKTIMEOUT = 0x4000;
public const uint DMLERR_BUSY = 0x4001;
public const uint DMLERR_DATAACKTIMEOUT = 0x4002;
public const uint DMLERR_DLL_NOT_INITIALIZED = 0x4003;
public const uint DMLERR_DLL_USAGE = 0x4004;
public const uint DMLERR_EXECACKTIMEOUT = 0x4005;
public const uint DMLERR_INVALIDPARAMETER = 0x4006;
public const uint DMLERR_LOW_MEMORY = 0x4007;
public const uint DMLERR_MEMORY_ERROR = 0x4008;
public const uint DMLERR_NOTPROCESSED = 0x4009;
public const uint DMLERR_NO_CONV_ESTABLISHED = 0x400a;
public const uint DMLERR_POKEACKTIMEOUT = 0x400b;
public const uint DMLERR_POSTMSG_FAILED = 0x400c;
public const uint DMLERR_REENTRANCY = 0x400d;
public const uint DMLERR_SERVER_DIED = 0x400e;
public const uint DMLERR_SYS_ERROR = 0x400f;
public const uint DMLERR_UNADVACKTIMEOUT = 0x4010;
public const uint DMLERR_UNFOUND_QUEUE_ID = 0x4011;
public const uint DMLERR_LAST = 0x4011;
public const uint EC_ENABLEALL = 0;
public const uint EC_ENABLEONE = ST_BLOCKNEXT;
public const uint EC_DISABLE = ST_BLOCKED;
public const uint EC_QUERYWAITING = 2;
/**//// </summary>
#endregion
private int dwDDEInst; // DDE Instance value
private int hconvCurrent;
private string lpszService;
private string lpszTopic;
private ArrayList alDdeItemList;
private Win32API.DdeCallback myCallback;
private System.Timers.Timer theTimer;//检查连接的计时器
private bool bConnected;
private bool bAutoConnect;
public string LinkName;
public string LinkDesc;
public string Service
{
get{return lpszService; }
set{lpszService=value; }
}
public string Topic
{
get{return lpszTopic;}
set{lpszTopic=value;}
}
public ArrayList ItemList
{
get{return alDdeItemList;}
set{alDdeItemList=value;}
}
public bool Connected
{
get{return bConnected;}
set{bConnected=value;}
}
public bool AutoConnect
{
get{return bAutoConnect;}
set{bAutoConnect=value;}
}
public DdeClient(string theService,string theTopic,string Desc)
{
dwDDEInst=0;
hconvCurrent = 0;
lpszService=theService;
lpszTopic=theTopic;
alDdeItemList=new ArrayList();
myCallback = new Win32API.DdeCallback(DdeClientCallback);
bConnected=false;
LinkName = theService+"|"+theTopic;
LinkDesc = Desc;
theTimer = new System.Timers.Timer(2000);
theTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
theTimer.AutoReset = true;
theTimer.Enabled = false;//暂时不用---设为false
}
public override string ToString()
{
return Service+"|"+Topic;
}
public bool Initialize()
{
int iInitResult=0;
iInitResult = Win32.DdeInitialize(ref dwDDEInst, myCallback,
(int)0x3f000,0);//CBF_FAIL_ALLSVRXACTIONS=0x3f000
if(iInitResult==0)return true;
else return false;
}
//
//
private unsafe int DdeClientCallback(
uint uType, // transaction type
uint uFmt, // clipboard data format
int hconv, // handle to the conversation
int hsz1, // handle to a string
int hsz2, // handle to a string
int hdata, // handle to a global memory object
uint dwData1, // transaction-specific data
uint dwData2) // transaction-specific data
{
int dwLength=0;
try
{
switch (uType)
{
case 0x4010://XTYP_ADVDATA:
try
{
sbyte* pData = (sbyte *)Win32.DdeAccessData(hdata, ref dwLength);
if((pData!=null) && (dwLength != 0))
{
sbyte* pSZ=stackalloc sbyte[30];
Win32.DdeQueryString(dwDDEInst,hsz2,pSZ,28,(int)CP_WINANSI);
if(ItemList.Count>0)
{
for(int i=0;i<ItemList.Count;i++)
{
string tmpSZ=new string(pSZ);
if(((DdeItem)ItemList[i]).ItemName.ToUpper()==tmpSZ.ToUpper())
{
string tmpData = new string(pData,0,dwLength);
((DdeItem)ItemList[i]).ItemValue=tmpData;
}
}
}
}
}
catch{}
finally
{
if(hdata!=0)Win32.DdeUnaccessData(hdata);
}
break;
case 0x80C2://XTYP_DISCONNECT:
Connected = false;
break;
default:
break;
}
}
catch
{
//
}
finally
{
}
return (int)DDE_FACK;
}
//当前没起作用
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
theTimer.Enabled = false;
if(!Connected)
{
if(AutoConnect)
{
ReEstablishLink();
}
}
theTimer.Enabled = true;
}
/**//*
//当前的Server是否可用(待测试)
private bool IsServiceAvailable(string lpszService)
{
int hszService;
int hConv;
hszService = Win32.DdeCreateStringHandle(dwDDEInst,lpszService,(int)CP_WINANSI);
//
// Try to connect to any topic
//
Win32API.CONVCONTEXT cc=new CONVCONTEXT();
hConv = Win32.DdeConnect(dwDDEInst,hszService,0,ref cc);
// Free the HSZs now
Win32.DdeFreeStringHandle(dwDDEInst, hszService);
if(hConv!=0)
{
Win32.DdeDisconnect(hConv);
return true;
}
return false;
}
*/
// [10/24/2003]
//建立连接
public unsafe bool EstablishLink()
{
int hConv=0;
int hszService, hszTopic;
Demolish();//如果是第一次,则什么也不做
Initialize();
// Connect to the server
hszTopic = Win32.DdeCreateStringHandle(dwDDEInst,lpszTopic,(int)CP_WINANSI);
hszService = Win32.DdeCreateStringHandle(dwDDEInst,lpszService,(int)CP_WINANSI);
Win32API.CONVCONTEXT cc=new CONVCONTEXT();
cc.cb=(uint)sizeof(Win32API.CONVCONTEXT);
hConv = Win32.DdeConnect(dwDDEInst,hszService,hszTopic,ref cc);
int DdeErrcode=Win32.DdeGetLastError(dwDDEInst);
Win32.DdeFreeStringHandle(dwDDEInst, hszTopic);
Win32.DdeFreeStringHandle(dwDDEInst, hszService);
if (hConv!=0)
{
if(hconvCurrent!=0)
{
Win32.DdeDisconnect(hconvCurrent);
}
hconvCurrent = hConv;
Connected = true;
return true;
}
else
{
Connected = false;
return false;
}
}
//销毁连接
public unsafe void Demolish()
{
if(dwDDEInst!=0)
{
Win32.DdeUninitialize(dwDDEInst);
dwDDEInst=0;
}
if(hconvCurrent!=0)
{
Win32.DdeDisconnect(hconvCurrent);
hconvCurrent=0;
}
}
//建立连接
public unsafe bool ReEstablishLink()
{
bool Elr=EstablishLink();
if (Elr)
{
Connected = true;
foreach(DdeItem item in ItemList)
{
TransactItem(item);
}
return true;
}
else
{
Connected = false;
return false;
}
}
// [10/24/2003]
//与Server建立Hoot连接
public unsafe bool TransactItem(DdeItem item)
{
int hszItem=0;
int dwResult=0;
int hDDEData=0;
if(item==null)return false;
if((hconvCurrent!=0) && item.ItemName !="")
{
hszItem = Win32.DdeCreateStringHandle(dwDDEInst,item.ItemName,(int)CP_WINANSI);
hDDEData = Win32.DdeClientTransaction(null,
0,
hconvCurrent,
hszItem,
1,//CF_TEXT,
(int)XTYP_ADVSTART,
TIMEOUT_ASYNC, // ms timeout
ref dwResult);
Win32.DdeFreeStringHandle(dwDDEInst, hszItem);
if(hDDEData!=0)
{
try
{
int dwLength=0;
sbyte* pData = (sbyte *)Win32.DdeAccessData(hDDEData, ref dwLength);
if((pData!=null) && (dwLength != 0))
{
string tmpData = new string(pData,0,dwLength);
item.ItemValue=tmpData;
}
}
catch{}
finally
{
Win32.DdeUnaccessData(hDDEData);
}
return true;
}
else
{
return false;
}
}
else
return false;
}
//必须设置item.ItemName和item.ItemValue后调用
public unsafe bool PokeItem(DdeItem item)
{
int hszItem=0;
int dwResult=0;
int hDDEData=0;
if(item==null)return false;
if((hconvCurrent!=0) && item.ItemName !="")
{
hszItem = Win32.DdeCreateStringHandle(dwDDEInst,item.ItemName,(int)CP_WINANSI);
//int errcode=Win32.DdeGetLastError(dwDDEInst);
ASCIIEncoding AE = new ASCIIEncoding();
byte[] ByteArray = AE.GetBytes(item.ItemValue);
int hd = Win32.DdeCreateDataHandle(dwDDEInst,ByteArray,ByteArray.Length,0,hszItem,1,0);
hDDEData = Win32.DdeClientTransaction(
ByteArray,ByteArray.Length,
hconvCurrent,hszItem,
1,//CF_TEXT,
(int)XTYP_POKE ,
0xFFFFFFFF, // ms timeout
ref dwResult);
Win32.DdeFreeStringHandle(dwDDEInst, hszItem);
if(hDDEData!=0)
{
return true;
}
else
{
return false;
}
}
else
return false;
}
public void PollRequestItem()
{
if(ItemList.Count>0)
{
for(int i=0;i<ItemList.Count;i++)
{
RequestItem((DdeItem)ItemList[i]);
}
}
}
// [10/24/2003]
//主动请求Item的值
public unsafe string RequestItem(DdeItem item)
{
int hszItem=0;
int dwResult=0;
int hDDEData=0;
int dwLength=0;
if(item==null)
{
item.ItemValue="";
return "";
}
if((hconvCurrent!=0) && item.ItemName !="")
{
hszItem = Win32.DdeCreateStringHandle(dwDDEInst,item.ItemName,(int)CP_WINANSI);
hDDEData = Win32.DdeClientTransaction(null,
0,
hconvCurrent,
hszItem,
1,//CF_TEXT,
(int)XTYP_REQUEST,
5000, // ms timeout
ref dwResult);
Win32.DdeFreeStringHandle(dwDDEInst, hszItem);
if(hDDEData!=0)
{
sbyte* pData = (sbyte *)Win32.DdeAccessData(hDDEData, ref dwLength);
{
if((pData!=null) && (dwLength != 0))
{
string tmpData = new string(pData,0,dwLength);
item.ItemValue=tmpData;
return tmpData;
}
else
{
item.ItemValue="";
return "";
}
}
}
else
{
item.ItemValue="";
return "";
}
}
else
{
item.ItemValue="";
return "";
}
}
//
}
}