⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 common.h

📁 如果应用程序在共享 DLL 中使用 MFC
💻 H
字号:
#ifndef NO_OPEN_QQ_COMMON
#define NO_OPEN_QQ_COMMON

#ifndef _Ken_Win32_CKWnd_
class DECLSPEC_NOVTABLE CKWnd{
public:
	HWND m_hWnd;
};
#endif

#define WM_QQ_SOCKET	(WM_USER+1)

class DECLSPEC_NOVTABLE CQQSocketBase{
public:
	virtual void Delete()=0;

	virtual int Recv(LPVOID lpBuf,int iSize)=0;
	virtual int RecvFrom(LPVOID lpBuf,int iSize,DWORD &ServerIP,WORD &ServerPort)=0;
	virtual int Send(LPCVOID lpBuf,int iSize)=0;
	virtual int SendTo(LPCVOID lpBuf,int iSize)=0;

	virtual BOOL IsValid() const=0;
	virtual void Close(BOOL IsSendRecv=FALSE)=0;
	virtual BOOL Connect(DWORD ServerIP,WORD ServerPort)=0;
	virtual BOOL ReConnect(DWORD ServerIP,WORD ServerPort)=0;
	virtual BOOL Bind(DWORD saddr=INADDR_ANY,WORD localport=0)=0;
	virtual BOOL SetEventHandle(HWND hWnd,DWORD Msg=WM_QQ_SOCKET,long lEvent=FD_READ)=0;

	SOCKET m_Socket;
	BOOL m_IsTCP;
	DWORD m_ServerIP;
	WORD m_ServerPort;
};

struct TQQPacketRecvHead{
	BYTE m_Header_Tag;
	WORD m_Source_Tag;
	WORD m_Cmd;
	WORD m_Seq;

	DWORD m_ServerIP;
	WORD m_ServerPort;
};

struct TRecvIMHead{
	DWORD m_FromID;
	DWORD m_MyID;
	DWORD m_ServerIP;
	WORD m_ServerPort;
	WORD m_Result;
};

struct TQQDataBase{
	DWORD m_QQ;
	BYTE m_Password[16];//二次MD5后的密码
	BYTE m_Status;//在线状态
	BOOL m_UseTM;//是否使用TM登陆
	BOOL m_HasVideo;//视频
};

class CQQGuiWndBase;
class CQQPacketBase;
class CQQConfigBase;
struct TQQClientDataEx;

class DECLSPEC_NOVTABLE CQQClientBase : public TQQDataBase{
public:
	virtual void Delete()=0;

	virtual void SetLoginPassword(LPCSTR lpPassword)=0;
	virtual void Login()=0;
	virtual void Logout()=0;
	virtual void KeepAlive()=0;
	virtual void ChangeStatus()=0;
	virtual CQQPacketBase *GetSendIMMsgPacket(DWORD TOID,LPCSTR lpMsg,LPCSTR lpFont,DWORD FontColor,BYTE FontFlag/*=9*/,BYTE replyType/*=QQ_IM_NORMAL_REPLY*/,WORD HeadIcon=0)=0;

	virtual void PushPacket(CQQPacketBase *lpQQPacket)=0;
	virtual CQQPacketBase *PopPacket()=0;
	virtual BOOL TransportPacket()=0;

	virtual TQQClientDataEx *ReAllocDataEx(int iSize)=0;

	void (*m_lpOnEvent)(CQQClientBase *This,DWORD Event,WPARAM wParam,LPARAM lParam);
	void (*m_lpOnRecvData)(CQQClientBase *This);
	BOOL (*m_lpOnRecvCmd)(CQQClientBase *This,TQQPacketRecvHead *lpRecvHead,CQQPacketBase *lpRecvPacket);
	void (*m_lpOnRecvIM1)(CQQClientBase *This,CQQPacketBase *lpRecvPacket);
	void (*m_lpOnRecvIM2)(CQQClientBase *This,CQQPacketBase *lpRecvPacket,TRecvIMHead *lpRecvIMHead);

	CQQSocketBase *m_lpSocket;

	WORD m_Ver;
	BYTE m_KeyData[16];
	BYTE *m_Token;//登录令牌
	BYTE m_TokenLen;//登录令牌长度
	WORD m_Seq;
	BOOL m_IsLogin;
	BOOL m_IsBeginLogin;
	DWORD m_KeepAliveFail;
	BYTE m_LastStatus;

	CQQGuiWndBase *m_lpGuiWndBase;
	TQQClientDataEx *m_lpClientDataEx;
};

class DECLSPEC_NOVTABLE CQQPacketBase{
public:
	virtual void Delete()=0;

	virtual void Reset()=0;
	virtual BYTE *GetBuffer()=0;
	virtual BYTE *GetCurrentBuffer()=0;
	virtual DWORD MaxSize()=0;
	virtual DWORD Size()=0;

	virtual BYTE Read_Byte()=0;
	virtual WORD Read_Word()=0;
	virtual DWORD Read_DWord()=0;
	virtual void Read_Data(LPVOID lpBuffer,int size)=0;

	virtual void Skip(DWORD size)=0;

	virtual void Write_Byte(BYTE Val)=0;
	virtual void Write_Word(WORD Val)=0;
	virtual void Write_DWord(DWORD Val)=0;
	virtual void Write_Data(LPCVOID lpBuffer,int size)=0;

////////////////////////////////////////////////////////////////////////////////
	//virtual void CreateHead(WORD Ver,DWORD qqid,WORD Cmd,WORD &seq)=0;
	virtual void CreateHead(CQQClientBase *lpQQClient,WORD Cmd)=0;
	virtual void WriteTail()=0;
	virtual void MakeCmdPacket(CQQClientBase *lpQQClient,WORD Cmd,LPCVOID lpBody,DWORD size)=0;
	virtual void Encrypt(LPCVOID lpBody,DWORD size,BYTE *keydata)=0;
	virtual void Encrypt(CQQPacketBase *lpBody,BYTE *keydata)=0;
	virtual void SetSeq(WORD Seq)=0;
////////////////////////////////////////////////////////////////////////////////
	virtual BOOL Decrypt(CQQPacketBase *lpRecvPacket,BYTE *keydata)=0;
////////////////////////////////////////////////////////////////////////////////
	virtual BOOL RecvFrom(CQQSocketBase *lpSocketBase,TQQPacketRecvHead *lpRecvHead)=0;
	virtual int SendTo(CQQSocketBase *lpSocketBase)=0;
////////////////////////////////////////////////////////////////////////////////

	int m_iSize;//有可能是接受的数据包大小,也有可能是编码后大小
};

typedef BOOL (*LPEnumQQClientFun)(CQQClientBase *lpQQClientBase,va_list argptr);
//va_arg(argptr,int);

class DECLSPEC_NOVTABLE CQQGuiWndBase{
public:
	virtual void Delete()=0;

	virtual CKWnd *GetWnd()=0;
	virtual void AddQQClient(CQQClientBase *lpQQClientBase)=0;		//CQQClient 内部自动添加
	virtual void RemoveQQClient(CQQClientBase *lpQQClientBase)=0;	//CQQClient 内部自动删除
	virtual BOOL EnumQQClient(LPEnumQQClientFun lpFun,...)=0;
	virtual void OnQQClientPushPacket()=0;

	BOOL (*m_lpOnHookMsg)(CQQGuiWndBase *This,UINT Msg,WPARAM wParam,LPARAM lParam,LRESULT &RetV);//返回TRUE则不引用默认消息
	CQQConfigBase *m_lpQQConfigBase;
};

class DECLSPEC_NOVTABLE CQQConfigBase{
public:
	virtual void Delete()=0;

	virtual void LoadConfig()=0;
	virtual void SaveConfig()=0;

	virtual void AddQQGuiWnd(CQQGuiWndBase *lpQQGuiWndBase)=0;		//CQQClient 内部自动添加
	virtual void RemoveQQGuiWnd(CQQGuiWndBase *lpQQGuiWndBase)=0;	//CQQClient 内部自动删除

	void (*m_lpOnSaveQQClient)(CQQClientBase *lpQQClientBase,IXMLDOMElement *lpElement);
	void (*m_lpOnLoadQQClient)(CQQClientBase *lpQQClientBase,IXMLDOMElement *lpElement);
	void (*m_lpOnLoadAddQQClient)(CQQConfigBase *This,IXMLDOMElement *lpElement);//在自己写GUI时必需重写,否则不能加载
	void (*m_lpOnLoadCommon)(CQQConfigBase *This,IXMLDOMElement *lpElement);//读取全局配置
	void (*m_lpOnSaveCommon)(CQQConfigBase *This,IXMLDOMElement *lpElement);//写入全局配置
	void (*m_lpOnChangeConfig)(CQQConfigBase *This);//如果在修改任何一个数据时都保存请重写,建议不要重写
};
/*
QQStartGui{ [主程序入口 - 插件]
	|CQQConfigBase			->由 QQStartGui 创建
		|CQQGuiWndBase			->自动添加到 CQQConfigBase
			|CQQClientBase			->自动添加到 CQQGuiWndBase
				|CQQSocketBase			->由 CQQClientBase 创建
					|CQQPacketBase			->由 CQQClientBase 或其它创建,由 CQQSocketBase 发送
}QQEndGui [不一定会引用,任何接口引用,由 QQStartGui 控制程序退出]
*/

#define MicroQQ_VER		(0x0000001B)
struct TQQPlugin{
	DWORD dwPluginSize;					//本结构大小
	union{
		DWORD MicroQQVer;					//注意:此版本号不要修改
		struct{
			WORD MicroQQ_MinorVer,MicroQQ_MajorVer;
			//如果 MicroQQ_MajorVer 变化,表明插件需要更新
		};
	};
	BOOL IsNT;							//是否WINNT
	HINSTANCE hInst;					//主程序句柄
	HICON hIcon;
	void (*lpQQStartGui)();
	void (*lpQQEndGui)();
	CQQPacketBase *(*lpNewQQPacket)();	//注意:此接口不可重写
	CQQSocketBase *(*lpNewQQSocket)();
	CQQClientBase *(*lpNewQQClient)(CQQGuiWndBase *lpGuiWndBase);
	CQQGuiWndBase *(*lpNewQQGuiWnd)(CQQConfigBase *lpQQConfigBase);
	CQQConfigBase *(*lpNewQQConfig)();
};

//extern "C" LPSTR OnInitQQPlugin(TQQPlugin *lpQQPlugin);
typedef LPSTR (*LPOnInitQQPlugin)(TQQPlugin *lpQQPlugin);

extern TQQPlugin m_QQPlugin;
extern TQQPlugin *m_lpQQPlugin;

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -