更新时间:2023-08-20 15:21:30
你们好,最近小艾特发现有诸多的小伙伴们对于sqlyog注册码在哪输入,sqlyog注册码这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。
1、 从网上下载SQLyog源代码并编译。具体过程可以参考我的另一个经验sqlyog源代码下载编译教程’,可以在我的经验文章中找到,如下图所示:
2、 使用vs2017(假设已经安装并支持MFC)打开SQLyog项目。sqlyog-community源代码目录下有一个构建目录,里面包含项目工程文件SQLyogCommunity.sln双击打开项目,如下图所示:
3、 跳过0 '表示SQLyog客户端程序已成功编译并生成,并且在'下生成了可执行exe文件SQLyogCommunity.exe.\ sqlyog-community \ bin \ win32 \ debug '目录,如下图所示:
4、 点击“本地获胜”.“调试器”启动正在运行的程序,并让其断点进入winmain函数的入口。程序启动后,断点先在WinMain函数中,如下图所示:
5、 可以看到,sqlyog项目的代码中有WinMain函数,WinMain是windows平台下应用的入口函数。具体来说,Winmain()函数是Win32程序的入口点,也就是说sqlyog项目是由Win32 SDK编码开发的。
6、 WinMain函数原型:
7、 int WINAPI WinMain(HINSTANCE hInstance,
8、 HINSTANCE hPreInstance,
9、
10、 LPSTR lpCmdLine,
11、
12、 int nCmdShow
13、 );
14、 当前实例的句柄。
15、 HPrevInstance -上一个实例的句柄
16、 LpCmdLine -命令行参数
17、 NCmdShow - Form显示表单(最大化和最小化)
18、 在windows下,win32 sdk编写应用程序的一般步骤如下:
19、 (1)实现函数WinMain,即根据其原型在源代码中定义;
20、 (2).创建一个窗口;
21、 (3).传播消息;
22、 (4)编写窗口程序函数。
23、 了解win32 sdk的编程步骤,用sqlyog项目的代码一步步分析。
24、 sqlyog项目代码中有一个名为WinMain.cpp的文件,函数WinMain就是在这个文件中实现的。代码如下:
25、 //Function:
26、 //The main function of the application.
27、 //The start of the software.
28、 wyInt32 WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance,
29、 PSTR cmdline, wyInt32 icmdshow)
30、 {
31、 .
32、 return msg.wParam;
33、 }
34、 详情如下:
35、 WinMain函数以一系列变量声明开始,定义配置和相关的初始化,如下面的代码所示:
36、 HINSTANCEhrich, hsci;
37、 #ifdef BLACKBOX
38、 HINSTANCEhblackbox;
39、 #endif
40、 FrameWindow *mainwin;
41、 MSG msg;
42、 wyBoolisVistaAnd32BitSQLyog=wyFalse;
43、 pGlobals=new GLOBALS;
44、
45、 _ASSERT(pGlobals !=NULL);
46、 //DEBUG_ENTER('WinMain');
47、 //call mysql_library_init to avoid crash
48、 if (mysql_library_init(0, NULL, NULL)) {
49、 DisplayErrorText(1, _('could not initialize MySQL library'));
50、 return 0;
51、 }
52、 //First clear every stuff in the pglobals variable.
53、 InitGlobals(pGlobals);
54、 InitWinSock();
55、 ///*Checks whether commandline argument as got explicit path for .ini, and other logfiles.
56、 //also filename whose contents as to be displayed in Sqlyog Editor
57、 //Otion can be any of one
58、 //i. SQLyogEnt.exe -dir 'E:\path' -f 'D:\test.sql'
59、 //ii. SQLyogEnt.exe -dir 'E:\path' 'D:\test.sql'
60、 //iii. SQLyogEnt.exe -f 'D:\test.sql' -dir 'E:\path' -f
61、 //-dir stands for explicit path for .ini, tags, logs, favourites , etc
62、 //-f stands for file to be oponed in editor
63、 //*/
64、 //Gets the Attributes passed through command line(-f, -dir)
65、 if(pGlobals-m_configdirpath.GetLength())
66、 //unsigned long len=0;
67、 //if(len=pGlobals-m_configdirpath.GetLength())
68、 pGlobals-m_configdirpath.Clear();
69、 if(GetConfigDetails(cmdline)==wyFalse)
70、 return 0;
71、 CreateInitFile();
72、 #ifndef _WIN64
73、 OSVERSIONINFOEX osvi;
74、 osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
75、 //get the OS version and set the display style accordingly
76、 if (GetVersionEx((OSVERSIONINFO*)osvi)) {
77、 if (osvi.dwMajorVersion==6 osvi.dwMinorVersion==0 osvi.wProductType==VER_NT_WORKSTATION)
78、 isVistaAnd32BitSQLyog=wyTrue;
79、 }
80、 #endif
81、 #ifdef _DEBUG
82、 HANDLE hlogfile=NULL;
83、
84、 hlogfile=CreateFile(L'SQLyog_debug_log.txt', GENERIC_WRITE, FILE_SHARE_WRITE,
85、 NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
86、 #else
87、 //Initialize the Path for .INI .dmp files
88、 CreateInitFile();
89、 if (isVistaAnd32BitSQLyog==wyFalse) {
90、 MiniDump dumpcrash;
91、 if (IsCrashDumpSupported()==wyTrue)
92、 dumpcrash.InitDumpDetails(pGlobals-m_configdirpath.GetString());
93、 }
94、 #endif
95、 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_WNDW);
96、 _CrtSetReportFile(_CRT_WARN, hlogfile);
97、 _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_WNDW);
98、 _CrtSetReportFile(_CRT_ERROR, hlogfile);
99、 _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_WNDW);
100、 _CrtSetReportFile(_CRT_ASSERT, hlogfile);
101、 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE );
102、 _CrtSetReportFile(_CRT_WARN, hlogfile);
103、 _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE );
104、 _CrtSetReportFile(_CRT_ERROR, hlogfile);
105、 _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE );
106、 _CrtSetReportFile(_CRT_ASSERT, hlogfile);
107、 _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
108、 VERIFY(hsci=:LoadLibrary(L'SciLexer.dll'));
109、 if(!hsci)
110、 {
111、 DisplayErrorText(GetLastError(), _('Error loading SciLexer.dll'));
112、 VERIFY(FreeLibrary(hsci));
113、 return 0;
114、 }
115、 pGlobals-m_statusbarsections=STATUS_BAR_SECTIONS;
116、 /* register scintilla */
117、 //Scintilla_RegisterClasses(NULL);
118、 #ifndef VC6
119、 /* startup gdiplus.this is required to display image in BLOB window */
120、 ULONG_PTRgditoken;
121、 Gdiplus:GdiplusStartupInput startupinput;
122、 Gdiplus:GdiplusStartup(gditoken, startupinput, NULL);
123、 #endif
124、 pGlobals-m_hinstance=hinstance;
125、 VERIFY(hrich=:LoadLibrary(L'Riched20.dll'));
126、 #ifdef BLACKBOX
127、 VERIFY(hblackbox=:LoadLibrary(L'BlackBox.dll'));
128、 #endif
129、 /* check for library problems */
130、 if(!hrich)
131、 {
132、 DisplayErrorText(GetLastError(), _('Error loading riched20.dll'));
133、 VERIFY(FreeLibrary(hsci));
134、 return 0;
135、 }
136、 为整个sqlyog项目的初始化做准备。
137、 初始化准备工作完成以后, 使用以下代码来创建sqlyog软件相关的窗口:
138、 pGlobals-m_findreplace=wyFalse;
139、 CreateCustomTabIconList();
140、 //Initialize the common controls.
141、 InitCustomControls();
142、 CollectCurrentWindowsVersion();
143、 pGlobals-m_modulenamelength=GetModuleNameLength();
144、 wyTheme:SubclassControls();
145、 if(!pGlobals-m_modulenamelength)
146、 {
147、 DisplayErrorText(GetLastError(), _('GetModuleFileName length failed!'));
148、 return 0;
149、 }
150、 SetLanguage(NULL, wyTrue);
151、 wyTheme:Init();
152、 //Create the mainwindow.
153、 mainwin=new FrameWindow(pGlobals-m_hinstance);
154、 类FrameWindow是sqlyog客户端的主界面窗口对应的类函数, 也就是整个应用程序的主窗口, 定义实现的文件在FrameWindow.h和FrameWindow.cpp, 这样子就有了程序的主框架窗口了, ui界面层的最大部分我们已经知道是如何生成的了。
155、 sqlyog客户端主界面确立以后, 接下来我们就需要事先消息循环了, 整个循环主要是来处理消息的,代码如下所示:
156、 //The main loop for messages.
157、 while(GetMessage(msg, NULL, 0, 0))
158、 {
159、 if(pGlobals-m_pcmainwin-m_finddlg)
160、 {
161、 if((pGlobals-m_pcmainwin-m_finddlg IsWindowVisible(pGlobals-m_pcmainwin-m_finddlg)
162、 IsDialogMessage(pGlobals-m_pcmainwin-m_finddlg, msg)))
163、 {
164、 pGlobals-m_findreplace=wyTrue;
165、 continue;
166、 }
167、 }
168、 if(!TranslateMDISysAccel(pGlobals-m_hwndclient, msg))
169、 {
170、 if(!(TranslateAccelerator(mainwin-GetHwnd(), g_accel, msg)))
171、 {
172、 ///code to catch Accel(short-cuts for Save Revert) key-press on Create/Alter table tabbed interface
173、 if(pGlobals-m_pcmainwin-m_htabinterface IsDialogMessage(pGlobals-m_pcmainwin-m_htabinterface, msg))
174、 {
175、 continue;
176、 }
177、
178、 if(pGlobals-m_pcmainwin-m_hwndtooltip msg.message==WM_LBUTTONDOWN)
179、 {
180、 FrameWindow:ShowQueryExecToolTip(wyFalse);
181、 }
182、 pGlobals-m_findreplace=wyFalse;
183、 TranslateMessage(msg);
184、 DispatchMessage(msg);
185、 }
186、 }
187、 }
188、 上面代码开启了消息循环。
189、 Windows操作系统为每一个正在运行的应用程序保持有一个消息队列。
190、 当有事件发生后, Windows并不是将这个激发事件直接送给应用程序,
191、 而是先将其翻译成一个Windows消息,
192、 然后再把这个消息加入到这个应用程序的消息队列中去。
193、 应用程序需要通过消息循环来接收这些消息。
194、 即Windows 中有一个系统消息队列, 对于每一个正在执行的Windows应用程序, 系统为其建立一个'消息队列', 即应用程序队列,用来存放该程序可能创建的各种窗口的消息。
195、 应用程序中含有一段称作'消息循环'的代码,
196、 用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。
197、 Windows是以消息驱动的操作系统, Windows 消息提供了应用程序与Windows系统之间进行通讯的手段。
198、 Windows应用程序是基于消息的程序设计模式, 使用事件驱动编程模型,
199、 分为消息概述、消息结构、消息类型。
200、 消息循环代码是应用程序中主函数WinMain ( )中类似如下的程序段:
201、 while(GetMessage(msg,NULL,0,0))
202、 {
203、 TranslateMessage(msg); //从消息队列中取得消息
204、 DispatchMessage(msg); //检索并生成字符消息WM_CHAR
205、 //将消息发送给相应的窗口函数
206、 }
207、 由此可见, 所谓'消息循环', 实际是程序循环。
208、 可以看到sqlyog客户端应用程序的消息循环就是在WinMain.cpp中实现的。
209、 由于Windows 应用程序创建的每个窗口都在系统核心注册一个相应的窗口函数, 窗口函数程序代码形式上是一个巨大的switch 语句, 用以处理由消息循环发送到该窗口的消息, 窗口函数由Windows 采用消息驱动的形式直接调用,
210、 而不是由应用程序显示调用的, 窗口函数处理完消息后又将控制权
211、 返回给Windows。
212、 也就是说sqlyog客户端应用程序中的每个窗口都会注册一个相应的窗口函数, 而每个窗口都对应有一个头文件和一个cpp文件, 举例如'Connect to MySQL Host'这个窗口(File---New Connection.), 可以看到整个过程的调用代码堆栈图下图所示, 可以看到最顶层的是FrameWindow:WndProc()函数,
213、 //The window procedure for MainWindow.
214、 //It creates all its child window in WM_CREATE message.
215、 LRESULTCALLBACK FrameWindow:WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
216、 {
217、 .
218、 }
219、 整个函数窗口过程函数在WM_CREATE消息响应时候创建了所有子窗口,
220、 case WM_CREATE:
221、 pcmainwin-OnCreate();
222、 return 0;
223、 函数代码如下:
224、 void FrameWindow:OnCreate()
225、 {
226、 // CreateToolBarWindow();
227、 CreateStatusBarWindow();
228、 CreateMDIWindow();
229、 m_findmsg=RegisterWindowMessage(FINDMSGSTRING);
230、 CheckForAutoKeywords();
231、 ConvertIniFileToUtf8();
232、 MigrateFiles();
233、 //MigratePersonalFolderToFavorites();
234、 return;
235、 }
236、 在这里创建了主界面窗口的子窗口, 每个子窗口都有一个窗口过程函数来处理各自的消息, 到此sqlyog客户端整个主体框架分析完毕。
以上就是sqlyog注册码这篇文章的一些介绍,希望对大家有所帮助。