using System;
using System.Collections.Generic;
using System.Text;
namespace HisDataToSqlServer
{
using System.Runtime.InteropServices;
#region "Win32 API 结构声明例子"
class Win32API
{
protected const uint DMLERR_NO_ERROR = 0;
protected const int APPCLASS_STANDARD = 0x0;
protected const int CBF_FAIL_SELFCONNECTIONS = 0x1000;
protected const int DNS_REGISTER = 0x0001;
protected const int CP_WINANSI = 1004;
protected const uint TIMEOUT_ASYNC = 0xFFFFFFFF;
protected const int XCLASS_FLAGS = 0x4000;
protected const int XTYP_POKE = (0x0090 | XCLASS_FLAGS);
protected const int XCLASS_DATA = 0x2000;
protected const int XTYP_REQUEST = (0x00B0 | XCLASS_DATA);
protected const int XCLASS_NOTIFICATION = 0x8000;
protected const int XTYP_XACT_COMPLETE = 0x0080 | XCLASS_NOTIFICATION;
[StructLayout(LayoutKind.Sequential)]
protected struct SECURITY_QUALITY_OF_SERVICE
{
public ushort Length;
public int ImpersonationLevel;
public int ContextTrackingMode;
public bool EffectiveOnly;
}
[StructLayout(LayoutKind.Sequential)]
protected 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;
}
[DllImport("user32.dll", EntryPoint = "DdeInitialize")]
protected static extern int DdeInitialize(ref int pidInst, DdeCallback pfnCallback, int afCmd, int ulRes);
[DllImport("user32.dll", EntryPoint = "DdeCreateStringHandle")]
protected static extern int DdeCreateStringHandle(int idInst, string psz, int iCodePage);
[DllImport("user32.dll", EntryPoint = "DdeFreeStringHandle")]
protected static extern int DdeFreeStringHandle(int idInst, int hsz);
[DllImport("user32.dll", EntryPoint = "DdeNameService")]
protected static extern int DdeNameService(int idInst, int hsz1, int hsz2, int afCmd);
[DllImport("user32.dll", EntryPoint = "DdeUninitialize")]
protected static extern int DdeUninitialize(int idInst);
[DllImport("user32.dll", EntryPoint = "DdeConnect")]
protected unsafe static extern int DdeConnect(int idInst, int hszService, int hszTopic, ref CONVCONTEXT pCC);
[DllImport("user32.dll", EntryPoint = "DdeDisconnect")]
public static extern int DdeDisconnect(int hConv);
[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 = "DdeClientTransaction")]
protected static extern int DdeClientTransaction(char[] pData, int ByVal, int hConv, int hszItem,
int wFmt, int wType, uint dwTimeout, ref int pdwResult);
protected delegate int DdeCallback(
uint uType,
uint uFmt,
int hconv,
int hsz1,
int hsz2,
int hdata,
uint dwData1,
uint dwData2
);
}
#endregion
public delegate void delegateWriteFile();
class DdeItem : Win32API
{
private DdeCallback myCallback;
private int dwDDEInst;
private int m_hConv;
protected unsafe int DdeClientCallback(
uint uType,
uint uFmt,
int hconv,
int hsz1,
int hsz2,
int hdata,
uint dwData1,
uint dwData2)
{
if (uType == XTYP_XACT_COMPLETE)
{
sbyte* pSZ = stackalloc sbyte[30];
DdeQueryString(dwDDEInst, hsz2, pSZ, 28, (int)CP_WINANSI);
string sTmp = new string(pSZ);
if (sTmp == "WriteFile")
{
}
}
return 0;
}
public DdeItem()
{
myCallback = new DdeCallback(DdeClientCallback);
DdeInitialize(ref dwDDEInst, myCallback, (APPCLASS_STANDARD | CBF_FAIL_SELFCONNECTIONS), 0);
int hszName = DdeCreateStringHandle(dwDDEInst, "MONITOR_DDE_SERVER", CP_WINANSI);
int i = DdeNameService(dwDDEInst, hszName, 0, DNS_REGISTER);
}
public bool connect(string server, string topic)
{
m_hConv = DDE_Connect_Server(server, topic);
if (m_hConv != 0)
{
if (DDE_Request(m_hConv) != 0)
{
return true;
}
}
return false;
}
public void Disconnect()
{
if (m_hConv != 0)
{
DdeDisconnect(m_hConv);
}
}
public void Demolish()
{
if (m_hConv != 0)
{
DdeDisconnect(m_hConv);
}
if (dwDDEInst != 0)
{
DdeUninitialize(dwDDEInst);
}
}
public void Poke(string csItem, string csData)
{
DDE_Poke(m_hConv, csItem, csData);
}
private int DDE_Connect_Server(string csServer, string csTopic)
{
int hszServer = DdeCreateStringHandle(dwDDEInst, csServer, CP_WINANSI);
int hszTopic = DdeCreateStringHandle(dwDDEInst, csTopic, CP_WINANSI);
CONVCONTEXT pc = new CONVCONTEXT();
int hConv = DdeConnect(dwDDEInst, hszServer, hszTopic, ref pc);
DdeFreeStringHandle(dwDDEInst, hszServer);
DdeFreeStringHandle(dwDDEInst, hszTopic);
return hConv;
}
private int DDE_Poke(int hConv, string csItem, string csData)
{
int hszData = DdeCreateStringHandle(dwDDEInst, csItem, CP_WINANSI);
char[] inputBytes = csData.ToCharArray();
int dwResult = 0;
int hData = DdeClientTransaction(inputBytes, csData.Length + 1, hConv, hszData, 1, XTYP_POKE, TIMEOUT_ASYNC, ref dwResult);
DdeFreeStringHandle(dwDDEInst, hszData);
return hData;
}
private int DDE_Request(int hConv)
{
int hszData = DdeCreateStringHandle(dwDDEInst, "\"MONITOR_DDE_SERVER\"", CP_WINANSI);
char[] inputBytes = { };
int dwResult = 0;
int hData = DdeClientTransaction(inputBytes, -1, hConv, hszData, 1, XTYP_REQUEST, TIMEOUT_ASYNC, ref dwResult);
DdeFreeStringHandle(dwDDEInst, hszData);
return hData;
}
}
}
C#: DDE通讯
最新推荐文章于 2024-04-29 08:06:32 发布