问题见下面红线部分
下面是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);
        }

解决方案 »

  1.   

      [DllImport( "User32.DLL")]
            public static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam); 
      

  2.   


    不使用这个可以实现吗?C#不熟悉,在C++,我也用这样来实现的,但是C#不是有委托和事件可以解决吗?
      

  3.   

    public class A
    {
    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();
            }
      

  4.   


    a.MessageEvent += MessageFunction;MessageFunction要怎么定义?