[原]VC极域电子教室相关功能的实现dll(差不多是“外挂”)

本文详细介绍了极域电子教室终结者DLL的功能,包括获取/设置学生端密码、班级、绑定IP等,并提供了使用教程。此外,还包含了一个未集成MFC的获取网段内所有教师端列表的线程函数示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

名       称:极域电子教室终结者dll
版       本:V1.0(支持极域电子教室V6 2007豪华版)
主要功能:(和极域电子教室相关的)
            获取/设置极域电子教室学生端密码
            获取/设置极域电子教室学生端班级
            获取极域电子教室学生端绑定IP
            获取/设置极域电子教室学生端进程保护状态
            获取/设置极域电子教室学生端断线锁屏状态
            关闭极域电子教室学生端进程
            模拟教师端发送远程消息(最累的。。)
其他功能:
            设置端口复用
            初始化Windows Socket 2
            获得注册表键值
            设置注册表键值
下载地址: http://yunpan.cn/QGQAdVLcExC75 (360云盘)
说      明:
1.打开"源文件\TopdomainTer.dsw",编译,生成TopdomainTer.dll文件和TopdomainTer.lib文件。
2.打开你自己的工程,在"工程->设置->连接"的"对象/库模块"中输入ws2_32.lib和TopdomainTer.lib,中间用空格分隔。
3.将TopdomainTer.h添加到你的工程,这样就可以引用里面的函数了,函数名称比较好理解,具体的函数功能可以在源文件中查看。
4.生成你的软件,使用时将TopdomainTer.dll放在你exe程序所在的目录下。
dll仅供学习和交流使用,不允许用于商业用途。但可以对程序完善、修改,如果发现了一些Bug或完善了程序,我希望您能发送一份到sunnysab@yeah.net。
您可以在任何地方免费发布这个程序并且不说明作者地址,但是别把别人的功劳清零了。。。
最后,感谢您的使用

有一个功能,获取网段内所有教师端的列表,代码已经写好,但是由于依赖MFC,没有加在dll中。代码如下:
DWORD  WINAPI  MonitorThread( LPVOID lpParameter )
{
    SOCKADDR_IN Local, 
                SockAddr;
    SOCKET      Socket,
                NewSocket;
    char        LocalIp[20];
    CListCtrl  *List = (CListCtrl*)lpParameter;

    if( List == NULL )
    {
        MessageBox( NULL, "List为空", NULL, 0 );
    }
    if( !InitWinsock2() )
    {
        MessageBox( NULL, "初始化 Windows Socket 2 失败!", NULL, MB_OK );
        return FALSE;
    }

    memset( LocalIp, 0, 20 );
    if( !GetTopdomainStudentIp( LocalIp ) )
    {
        MessageBox( NULL, "获取绑定的IP地址失败!", NULL, MB_OK );
        WSACleanup();
        return FALSE;
    }
    Socket = WSASocket( AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_MULTIPOINT_D_LEAF|
                                                         WSA_FLAG_MULTIPOINT_C_LEAF|
														 WSA_FLAG_OVERLAPPED );
    if( !Socket )
    {
        MessageBox( NULL, "获取套接字失败!", NULL, MB_OK );
        WSACleanup();
        return FALSE;
    }
    if( !SetPortReUse( Socket ) )
    {
        MessageBox( NULL, "设置端口重用失败!", NULL, MB_OK );
        closesocket( Socket );
        WSACleanup();
        return FALSE;
    }
    Local.sin_family = AF_INET;
    Local.sin_addr.s_addr = inet_addr( LocalIp );
    Local.sin_port = htons(4804);

    if( bind( Socket, (sockaddr*)&Local, sizeof(Local)) == SOCKET_ERROR )//绑定
    {
        MessageBox( NULL, "绑定端口失败!", NULL, MB_OK );
        closesocket( Socket );
        WSACleanup();
        return FALSE;
    }
    SockAddr.sin_family    =   AF_INET;
    SockAddr.sin_port      =   htons( 4804 );
    SockAddr.sin_addr.S_un.S_addr   =   inet_addr( "224.40.40.40" );

	if( ( NewSocket = WSAJoinLeaf( Socket, (SOCKADDR*)&SockAddr,sizeof(SockAddr),NULL,NULL,NULL,NULL, JL_BOTH) ) == SOCKET_ERROR )
	{
        MessageBox( NULL, "加入组播失败!", NULL, MB_OK );
        closesocket( Socket );
        WSACleanup();
        return FALSE;
	}

    for( ; ; )
    {
        char Js[100];
        int  len = sizeof(SockAddr);

        memset( Js, 0, 100 );

        if( recvfrom( NewSocket, Js, 100, 0, (SOCKADDR*)&SockAddr, &len ) == SOCKET_ERROR )
        {
            MessageBox( NULL, "接收后数据失败!", NULL, MB_OK );
            closesocket( Socket );
            WSACleanup();
            return FALSE;
        }
        char  *TeacherIp = new char[20];
        char  *MultIp    = new char[20];
        char  *TeacherName = new char[30];
        char  *port = new char[10];
        char  *_class = new char[10];
        int    Class = 0;
        short  Port = 0;
        int    ret = 0;

        memset( TeacherIp, 0, 20 );
        memset( MultIp, 0, 20 );
        memset( TeacherName, 0, 30 );
        memset( _class, 0, 10 );
        memset( port, 0, 10 );
        ret = ResolveTeacherMessage( Js, TeacherIp, MultIp, TeacherName, Class, Port );

        sprintf( port, "%d", (unsigned short)Port );
        sprintf( _class, "%d", Class );
        switch( ret )
        {
        case 0: {
                    int  Count = List->GetItemCount();
                    bool Repeat = false;
                    CString Rclass;

                    Rclass.Format( "%d", Class );
                    for( int i = 0; i < Count; i ++ )
                    {
                        if( !Rclass.CompareNoCase( List->GetItemText( i,2 ) ) )
                        {
                            Repeat = true;
                            break;
                        }
                    }
                    if( !Repeat )
                    {
                        List->InsertItem(  Count, TeacherIp, 0 );
                        List->SetItemText( Count, 1, MultIp );
                        List->SetItemText( Count, 2, _class );
                        List->SetItemText( Count, 3, port );
                        List->SetItemText( Count, 4, TeacherName );
                    }
                    break;
                }
        }
        delete[]  TeacherIp;
        delete[]  MultIp;
        delete[]  _class;
        delete[]  port;
        delete[]  TeacherName;
    }
    closesocket(Socket);
    WSACleanup();
    
    return TRUE;
}

       这是一个线程函数。参数一定要是由(CListCtrl*)转换来的。由于可移植性不强,代码仅供参考。
        更多功能希望你来完善!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值