问题见下面红线部分
下面是DLL代码:
public class FtpClient : IDisposable
{
private static int INTERNET_OPEN_TYPE_DIRECT = 1;
private static int INTERNET_SERVICE_FTP = 1;
private static int INTERNET_FLAG_PASSIVE = 0x08000000; // used for FTP connections
private static int INTERNET_FLAG_TRANSFER_ASCII = 0x00000001; public class MessageEventArgs : EventArgs
{
public string strMsg;
} public delegate void MessageEventHandler(object sender, MessageEventArgs e);
public event MessageEventHandler MessageEvent; protected virtual void OnMessageEvent(MessageEventArgs e)
{
if (MessageEvent != null)
{
MessageEvent(this, e);
}
} [DllImport("wininet.dll")]
private static extern IntPtr InternetOpen(String lpszAgent, Int32 dwAccessType, String lpszProxy, String lpszProxyBypass, Int32 dwFlags);
//省掉其它DllImport... //Constructor for the FtpClient
public FtpClient()
{
} public void Close()
{
Dispose();
} public void Open(string lpszServerName, int nPort, string lpszUserName, string lpszPassword)
{
MessageEventArgs e = new MessageEventArgs();
try
{
hInternet = InternetOpen("TASHI-FTP", INTERNET_OPEN_TYPE_DIRECT, string.Empty, string.Empty, 0); if (hInternet != IntPtr.Zero)
{
hConnect = InternetConnect(hInternet, lpszServerName, nPort, lpszUserName, lpszPassword,
INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
if (hConnect == IntPtr.Zero)
{
e.strMsg = "InternetConnect Failed.";
OnMessageEvent(e);
}
}
else
{
e.strMsg = "InternetOpen Failed.";
OnMessageEvent(e);
}
}
catch (Exception ex)
{
if (hConnect != IntPtr.Zero)
InternetCloseHandle(hConnect);
hConnect = IntPtr.Zero; if (hInternet != IntPtr.Zero)
InternetCloseHandle(hInternet);
hInternet = IntPtr.Zero; e.strMsg = ex.Message;
OnMessageEvent(e);
}
} public Boolean PutFile(String lpszLocalFile, String lpszNewRemoteFile)
{
if (hConnect == IntPtr.Zero)
return false; MessageEventArgs e = new MessageEventArgs();
Boolean bRet = false; bRet = FtpPutFile(hConnect, lpszLocalFile, lpszNewRemoteFile, INTERNET_FLAG_TRANSFER_ASCII, 0);
if (!bRet)
{
//e.strMsg = "FtpPutFile Failed:" + GetLastError().ToString();
e.nError = GetLastError();
if (e.nError == 2)
{
e.strMsg = "File not exit.";//这个信息如何传给窗体?还是用Event不合理,要怎么改进?
}
else
{
e.strMsg = "File are being transmitted...";//这个如何传给窗体?
}
}
else
{
e.strMsg = "FtpPutFile Success.";
}
OnMessageEvent(e);
return bRet;
}
public class UnFtpClient
{
private Thread hSendThread = null;
private string m_lpszLocalFile;
private string m_lpszNewRemoteFile;
private string m_lpszRemoteFile;
private string m_lpszNewFile;
private string m_lpszServerName;
private int m_nPort;
private string m_lpszUserName;
private string m_lpszPassword;
private FtpClient ftpClient;
public string Message; public UnFtpClient(string lpszServerName, int nPort, string lpszUserName, string lpszPassword)
{
m_lpszServerName = lpszServerName;
m_nPort = nPort;
m_lpszUserName = lpszUserName;
m_lpszPassword = lpszPassword; ftpClient = new FtpClient();
ftpClient.MessageEvent += new FtpClient.MessageEventHandler(ftpClient_MessageEvent);
} public void ftpClient_MessageEvent(object sender, FtpClient.MessageEventArgs e)
{
Message = e.strMsg;//总感觉这样封装挺不合理的,但是不懂得改进
} private void FtpOpen()
{
ftpClient.Open(m_lpszServerName, m_nPort, m_lpszUserName, m_lpszPassword);
} private void SendFile()
{
FtpOpen();
ftpClient.PutFile(m_lpszLocalFile, m_lpszNewRemoteFile);
FtpClose();
} public void PutFile(String lpszLocalFile, String lpszNewRemoteFile)
{
m_lpszLocalFile = lpszLocalFile;
m_lpszNewRemoteFile = lpszNewRemoteFile; ThreadStart ts1 = new ThreadStart(SendFile);
hSendThread = new Thread(ts1);
hSendThread.Start();
} private void FtpClose()
{
if (hSendThread != null)
{
hSendThread.Abort();
hSendThread = null;
} if (hDownLoadThread != null)
{
hDownLoadThread.Abort();
hDownLoadThread = null;
} ftpClient.Close();
}
}
接着在窗体去调用DLL函数
private void btnGetFile_Click(object sender, EventArgs e)
{
UnFtpClient unFtpClient = new UnFtpClient(txtServer.Text, Convert.ToInt32(txtPort.Text), txtAccount.Text, txtPassword.Text);
unFtpClient.GetFile(txtRemoteFile.Text, txtLocalFile.Text); MessageBox.Show(unFtpClient.Message);
}
下面是DLL代码:
public class FtpClient : IDisposable
{
private static int INTERNET_OPEN_TYPE_DIRECT = 1;
private static int INTERNET_SERVICE_FTP = 1;
private static int INTERNET_FLAG_PASSIVE = 0x08000000; // used for FTP connections
private static int INTERNET_FLAG_TRANSFER_ASCII = 0x00000001; public class MessageEventArgs : EventArgs
{
public string strMsg;
} public delegate void MessageEventHandler(object sender, MessageEventArgs e);
public event MessageEventHandler MessageEvent; protected virtual void OnMessageEvent(MessageEventArgs e)
{
if (MessageEvent != null)
{
MessageEvent(this, e);
}
} [DllImport("wininet.dll")]
private static extern IntPtr InternetOpen(String lpszAgent, Int32 dwAccessType, String lpszProxy, String lpszProxyBypass, Int32 dwFlags);
//省掉其它DllImport... //Constructor for the FtpClient
public FtpClient()
{
} public void Close()
{
Dispose();
} public void Open(string lpszServerName, int nPort, string lpszUserName, string lpszPassword)
{
MessageEventArgs e = new MessageEventArgs();
try
{
hInternet = InternetOpen("TASHI-FTP", INTERNET_OPEN_TYPE_DIRECT, string.Empty, string.Empty, 0); if (hInternet != IntPtr.Zero)
{
hConnect = InternetConnect(hInternet, lpszServerName, nPort, lpszUserName, lpszPassword,
INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
if (hConnect == IntPtr.Zero)
{
e.strMsg = "InternetConnect Failed.";
OnMessageEvent(e);
}
}
else
{
e.strMsg = "InternetOpen Failed.";
OnMessageEvent(e);
}
}
catch (Exception ex)
{
if (hConnect != IntPtr.Zero)
InternetCloseHandle(hConnect);
hConnect = IntPtr.Zero; if (hInternet != IntPtr.Zero)
InternetCloseHandle(hInternet);
hInternet = IntPtr.Zero; e.strMsg = ex.Message;
OnMessageEvent(e);
}
} public Boolean PutFile(String lpszLocalFile, String lpszNewRemoteFile)
{
if (hConnect == IntPtr.Zero)
return false; MessageEventArgs e = new MessageEventArgs();
Boolean bRet = false; bRet = FtpPutFile(hConnect, lpszLocalFile, lpszNewRemoteFile, INTERNET_FLAG_TRANSFER_ASCII, 0);
if (!bRet)
{
//e.strMsg = "FtpPutFile Failed:" + GetLastError().ToString();
e.nError = GetLastError();
if (e.nError == 2)
{
e.strMsg = "File not exit.";//这个信息如何传给窗体?还是用Event不合理,要怎么改进?
}
else
{
e.strMsg = "File are being transmitted...";//这个如何传给窗体?
}
}
else
{
e.strMsg = "FtpPutFile Success.";
}
OnMessageEvent(e);
return bRet;
}
public class UnFtpClient
{
private Thread hSendThread = null;
private string m_lpszLocalFile;
private string m_lpszNewRemoteFile;
private string m_lpszRemoteFile;
private string m_lpszNewFile;
private string m_lpszServerName;
private int m_nPort;
private string m_lpszUserName;
private string m_lpszPassword;
private FtpClient ftpClient;
public string Message; public UnFtpClient(string lpszServerName, int nPort, string lpszUserName, string lpszPassword)
{
m_lpszServerName = lpszServerName;
m_nPort = nPort;
m_lpszUserName = lpszUserName;
m_lpszPassword = lpszPassword; ftpClient = new FtpClient();
ftpClient.MessageEvent += new FtpClient.MessageEventHandler(ftpClient_MessageEvent);
} public void ftpClient_MessageEvent(object sender, FtpClient.MessageEventArgs e)
{
Message = e.strMsg;//总感觉这样封装挺不合理的,但是不懂得改进
} private void FtpOpen()
{
ftpClient.Open(m_lpszServerName, m_nPort, m_lpszUserName, m_lpszPassword);
} private void SendFile()
{
FtpOpen();
ftpClient.PutFile(m_lpszLocalFile, m_lpszNewRemoteFile);
FtpClose();
} public void PutFile(String lpszLocalFile, String lpszNewRemoteFile)
{
m_lpszLocalFile = lpszLocalFile;
m_lpszNewRemoteFile = lpszNewRemoteFile; ThreadStart ts1 = new ThreadStart(SendFile);
hSendThread = new Thread(ts1);
hSendThread.Start();
} private void FtpClose()
{
if (hSendThread != null)
{
hSendThread.Abort();
hSendThread = null;
} if (hDownLoadThread != null)
{
hDownLoadThread.Abort();
hDownLoadThread = null;
} ftpClient.Close();
}
}
接着在窗体去调用DLL函数
private void btnGetFile_Click(object sender, EventArgs e)
{
UnFtpClient unFtpClient = new UnFtpClient(txtServer.Text, Convert.ToInt32(txtPort.Text), txtAccount.Text, txtPassword.Text);
unFtpClient.GetFile(txtRemoteFile.Text, txtLocalFile.Text); MessageBox.Show(unFtpClient.Message);
}
public static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam);
不使用这个可以实现吗?C#不熟悉,在C++,我也用这样来实现的,但是C#不是有委托和事件可以解决吗?
{
public delegate void MessageDelegate(string strMsg); public event MessageDelegate MessageEvent;
public void Test()
{
if (MessageEvent != null)
{
MessageEvent("开始");
}
}}
private A a= new A();
private void Form1_Load(object sender, EventArgs e)
{
a.MessageEvent += MessageFunction;
}
private void button1_Click(object sender, EventArgs e)
{
a.Test();
}
a.MessageEvent += MessageFunction;MessageFunction要怎么定义?