开发者

mfc与vs成功在xp系统所需做的修改方式

目录
  • 前言
  • 一、MFC程序 ‘inet_pton’ 、‘CT2A’ 未声明问题
    • 1)问题1:‘inet_pton’:undeclared identifier - 'inet_pton’未声明
    • 2)问题python1:‘CT2A’:undeclared identifier - 'CT2A’未声明
  • 二、VS程序 使用事件、委托问题
    • 1)问题:无法正确识别DataReceived?.Invoke(this, str);的语法
  • 总结

    前言

    运用在Windows xp环境下调试,发现有些方法是在xp环境下不能实现的,今天将mfc程序和C#程序修改的方面进行总结

    一、MFC程序 ‘inet_pton’ 、‘CT2A’ 未声明问题

    在VC++6.0中加入新编写的代码,会报上述问题,主要是因为该老旧开发环境与现代API和ATL/MFC宏的兼容性问题。

    1)问题1:‘inet_pton’:undeclared identifier - 'inet_pton’未声明

    其原因:

    • inet_pton 是较新的POSIX标准函数,VC6 默认不支持(需Windows SDK 8.0+)。
    • VC6 自带的 wsock32.h 仅提供旧版函数如 inet_addr。

    解决方法:

    改用inet_addr,代码更改如下:

    BOOL CSocketNet::ServerSet()
    {
    	// 设置服务器地址
    	server.sin_family = AF_INET;
    	server.sin_port = htons(8888); // 服务器端口
    
    	server.sin_addr.s_addr = inet_addr("127.0.0.1");
    	if (server.sin_addr.s_addr == INADDR_NONE)
    	{
    		closesocket(clientSocket);
    		WSACleanup();
    		AfxMessjsageBox(_T(www.devze.com"设置服务器地址失败!"), MB_OK | MB_ICONINFORMATION);
    		return FALSE;
    	}
    	else
    	{
    		return TRUE;
    	}
    }
    

    2)问题1:‘CT2A’:undeclared identifier - 'CT2A’未声明

    其原因:

    • CT2A 是ATL/MFC的字符串转换宏,VC6 默认未启用ATL支持。

    解决方法:

    强制使用ANSI版本 - 代码如下:

    BOOL CSocketNet::SendMes(CString str) {
        // 强制转换为ANSI字符串(VC6默认字符集)
        LPCSTR ansiMsg = (LPCSTR)str;  // 直接转换(仅当str为ANSI时安全)
        
        if (send(clientSocket, ansiMsg, strlen(ansiMsg), 0) < 0) {
            return FALSE;
        }
        return TRUE;
    }
    

    二、VS程序 使用事件、委托问题

    1)问题:无法正确识别DataReceived?.Invoke(this, str);的语法

    其原因:

    C# 版本兼容性问题​​:

    • ?.(null 条件运算符)和 Invoke 的事件触发语法需要 ​​C# 6.0+​​。
    • 如果你的项目使用的是旧版 C#(如 5.0),会报语法错误。

    事件委托类型不匹配​​:

    • EventHandler 是标准事件委托类型,但可能因项目配置导致编译器无法识javascript别其 Invoke 方法。

    解决方法:使用传统事件触发方式,代码如下:

    1、在需事件监听的类中,以CodeService类为例,编写如下代码:

    namespace ConsoleApplocational.Service
    {
    	// 定义委托,用于事件处理程序的签名
    	public delegate void DataReceivedEventHandler(object sender,string data);
    	
    	class CodeService
    	{
    		...
    	} 
    }
    

    2、在CodeService类中定义事件并实现触发方法,代码如下:

    class CodeService
    {
        // 定义事件
        public event DataReceivedEventHandler DataReceived;
        。。。
    }
    

    3、在CodeService类中的对应方法触发事件,代码如下:

    void HandleClient(TcpClient client)
    {
        using (client)
        {
            usijsng (var stream = client.GetStream())
            {
                byte[] buffer = new byte[1024];
                int bytesRead;
    
                while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                    Console.WriteLine("Received from C++:" + receivedData);
                    
                    // 触发事件
                    if(DataReceived != null)
                    {
                    	DataReceived(this, receivedData);
                    }
                }
            }
        }
    }
    

    4、在main函数里,跟之前一样定义,代码如下:

    namespace ConsoleApplication1
    {
    	static void Main(string[] args)
    	{
    		CodeService codeService = new CodeService();
    		codeService.DataReceived += OnDataReceived; // 订阅事件
    	}	
    	
    	public static void OnDataReceived(object sender, string data)
    	{
        	StrLine = data; //获取数据
        }
    }
    

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜