ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:25.49KB ,
资源ID:12542318      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12542318.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VC开发以及外挂制作总结.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

VC开发以及外挂制作总结.docx

1、VC开发以及外挂制作总结1.注册dllregsvr32 JpgShowCtl.ocx2.如果调用了AfxInitOle,那么就不用调用CoInitialize因为AfxInitOle已经调用过了而调用CoInitialize需要最后时候调用CoUnInitialize与AfxOleInit()对应的是,AfxOleTerm()。 AfxOleInit()和AfxOleTerm()其实也是需要成对的,但是,在你的程序中,AfxOleTerm()可以不出现,这是因为,MFC已经帮你做好了(有兴趣的话,你可以仔细研究一下CWinThread:m_lpfnOleTermOrFreeLib,而CWinA

2、pp是从CWinThread继承的)。3. HWND oldHWnd = NULL; EnumWindows(EnumWndProc,(LPARAM)&oldHWnd); /枚举所有运行的窗口 if(oldHWnd != NULL) :ShowWindow(oldHWnd,SW_SHOWMAXIMIZED); /激活找到的前一个程序 :SetForegroundWindow(oldHWnd); /把它设为前景窗口 return FALSE; /退出本次运行 CString g_szPropName = GPSWEBVER;HANDLE g_hValue = (HANDLE)1;4.添加一个枚举

3、窗口的函数BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam) HANDLE h = GetProp(hwnd,g_szPropName); if( h = g_hValue) *(HWND*)lParam = hwnd; return false; return true;GetVersionEx在一个OSVERSIONINFO结构中载入与平台和操作系统有关的版本信息 5.关于htmlView使用心得首先定义一个子类例如CHtmlCtrl继承CHtmlView然后实现虚函数Create这个Create需要实现以下代码m_pCreateConte

4、xt = pContext; if (!CView:Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext) return FALSE; RECT rectClient; GetClientRect(&rectClient); / create the control window / AFX_IDW_PANE_FIRST is a safe but arbitrary ID if (!m_wndBrowser.CreateControl(CLSID_WebBrowser, lpszWindo

5、wName, WS_VISIBLE | WS_CHILD, rectClient, this, AFX_IDW_PANE_FIRST) DestroyWindow(); return FALSE; LPUNKNOWN lpUnk = m_wndBrowser.GetControlUnknown(); HRESULT hr = lpUnk-QueryInterface(IID_IWebBrowser2, (void*) &m_pBrowserApp); if (!SUCCEEDED(hr) m_pBrowserApp = NULL; m_wndBrowser.DestroyWindow(); D

6、estroyWindow(); return FALSE; return TRUE;这样就可以通过IDispatch接口响应到网页的一些事件,包括点击移动以及js事件。6.用CreateDC,getDC等建立了DC后,在不再使用时应该用ReleaseDC释放他们所建立的DC,而用 CreateCompatibleDC 建立的DC应该用DeleteDC释放7.CBitmap HBITMAP 相互转化CBitmap *pBitmap = new CBitmap这个时候只有CBitmap的空间,但是没有图像需要pBitmap-Attach(hBitmap)来获得图像而CDC获取图像的方式是CDC.S

7、electObject(hNewBitmap)同时返回里面的hOldBitmappBitmap使用完以后需要DeleteObject这样就释放掉与其相关的资源,而且可以Attach新的资源。而delete pBitmap则不会释放资源,只会讲自己CBitmap对象释放掉。8.回调函数的使用一般来说回调函数的应用的一种情况void fun1()许多代码1 logic1();许多代码2void fun2()许多代码1logic2()许多代码2fun1和fun2功能上基本一致,但是有很少部分逻辑有点区别。而许多代码2和许多代码1不大容易变成函数。这个时候就需要根据外面的调用把logic1和logic

8、2当做参数传进来,在适当的时候调用fun(logicfun &logic)许多代码1logic许多代码2这样就把函数内部的逻辑变到了参数上面去。9.Invalidate() - RedrawWindow() - UpdateWindow()三个函数有什么异同? Invalidate()是强制系统进行重画,但是不一定就马上进行重画。因为Invalidate()只是通知系统,此 时的窗口已经变为无效。强制系统调用WM_PAINT,而这个消息只是Post就是将该消息放入消息队列。当执行到WM_PAINT消息时才会对敞口进行重绘。 UpdateWindow只向窗体发送WM_PAINT消息,在发送之前判

9、断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT。 RedrawWindow()则是具有Invalidate()和UpdateWindow()的双特性。声明窗口的状态为无效,并立即更新窗口,立即调用WM_PAINT消息处理。 /CArray10.在使用一个数组之前,先用SetSize函数建立数组的大小,并为数组分配内存。如果应用程序没有使用SetSize函数,则向数组中增加元素会使它被频繁地再分配和拷贝。频繁再分配和拷贝的效率很低,并且可能使内存变得很零碎。指针数组不能被串行化。当一个指针数组被删除时,或当其元素被删掉时,只

10、删掉指针,而这些指针所引用的实体不被删除。11.下载文件时候的动画 HWND m_hAnimationCtrl; HINSTANCE m_hInstance,m_avi; / TODO: Add extra initialization here if(m_avi=LoadLibrary(Shell32.dll)=NULL) MessageBox(Unable to load library.,ANI,0); else /Library loaded now create the animation control m_hAnimationCtrl=CreateWindowEx(0, /Sty

11、le ANIMATE_CLASS, /Class Name NULL, /Window name WS_CHILD|WS_VISIBLE| /Window Style ACS_TRANSPARENT|ACS_CENTER, 0, /Left 0, /Top 360, /Right 60, /Bottom m_hWnd, /Handle of parent NULL, /Menu m_avi, /hInstance NULL); /User defined style /Control created Now open the avi resource if(:SendMessage(m_hAn

12、imationCtrl,ACM_OPEN,(WPARAM)m_avi,(LPARAM)161)=NULL) MessageBox(Cannot Load the avi resource,ANI,0);/play :SendMessage(m_hAnimationCtrl,ACM_PLAY,(WPARAM)-1,MAKELONG(0,-1);/STOP :SendMessage(m_hAnimationCtrl,ACM_STOP,(WPARAM)-1,MAKELONG(0,-1);/获取按钮,给按钮发送消息 CWnd *pButton1 = GetDlgItem(IDC_BUTTON1); i

13、f(pButton1) :SendMessage(pButton1-m_hWnd, BM_CLICK, 0 , 0); 给菜单项发送消息 :SendMessage(AfxGetMains);GetSafeHwnd(),WM_COMMAND,ID_TEST1,NULL);设置状态栏第一个地方的文字m_wndStatusBar.SetPaneText(0, hello world);12.在MainFrame框架下有个消息循环,底层的实现是这样的。Because the return value can be nonzero, zero, or -1, avoid code like this:w

14、hile (GetMessage( lpMsg, hWnd, 0, 0) .The possibility of a -1 return value means that such code can lead to fatal application errors. Instead, use code like this:BOOL bRet;while( (bRet = GetMessage( &msg, hWnd, 0, 0 ) != 0) if (bRet = -1) / handle the error and possibly exit else TranslateMessage(&m

15、sg); DispatchMessage(&msg); An application typically uses the return value to determine whether to end the main message loop and exit the program. 如果点击菜单或者按钮就会有消息进入这个消息循环,从而被DispatchMessage分发到相应的处理过程去处理。如果发送WM_QUIT消息,就会返回-1,从而整个驱动的核心被停止。但是如果你在一个消息处理的事件中加入循环,那么系统就不会再响应其他消息,直到你的循环结束。如果你想让系统响应其他消息,那么你的

16、循环事件必须做成多线程程序。多线程MFC下有两种方式一个是工作者线程一个是用户界面线程。工作者线程不会响应消息,一般是做后台工作。用户界面线程可以响应消息。13.如何等待线程退出,然后主线程再退出比如主线程有10个子线程,当主线程退出前要等待子线程退出。但是这个时候子线程可能在完成一些工作,比如写文件等,如果强行中止会影响结果。一个方式是循环等待所有线程退出 WaitForSingleObject(Threadi-m_hThread,TIMEOUT);/这里可以考虑使用INFINITE GetExitCodeThread(Threadi-m_hThread,&dwExitCode);if(dw

17、ExitCode = STILL_ACTIVE)TerminateThread(Threadi-m_hThread, dwExitCode);如果退出码不对,那么需要强制退出。也可以把句柄放到数组里面,同时等待退出WaitForMultipleObjects(10, handle,TRUE,10000);14.比如带界面的程序最小化,能够把堆中分配的内存释放掉。15.Warning: constructing COleException, scode = DISP_E_MEMBERNOTFOUND ($80020003).发现这个错误一般都是继承htmlView的时候OnSize没有处理好vo

18、id CGpsSCView:OnSize(UINT nType, int cx, int cy) CHtmlView:OnSize(nType, cx, cy);if (:IsWindow(m_hWnd) CRect rect; GetClientRect(rect); / 就这一句与 CHtmlView 的不同 :AdjustWindowRectEx(rect, GetStyle(), FALSE, WS_EX_CLIENTEDGE); SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOACT

19、IVATE | SWP_NOZORDER); 16.如果使用MFC扩展库来做dll,如果在dll中需要使用dll的资源,那么如果就需要使用GetModuleHandle(*.dll)来获取dll句柄。如果需要使用主程序的资源,*.dll就替换为空注意代码中,如果都使用IDB_BITMAP1,需要将主程序的IDB_BITMAP1定义为和dll一样的值。否则就会载入失败。17.使用CreateFile来追加文件内容。 m_file = CreateFile( c:test.txt, GENERIC_WRITE | SYNCHRONIZE, FILE_SHARE_WRITE | FILE_SHARE

20、_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL ); SetFilePointer(m_file,0,NULL,FILE_END); DWORD nCOunt= 0; WriteFile(m_file,hello world,strlen(hello world),&nCOunt,NULL); CloseHandle(m_file);18.VC6.0 设置动态链接库工程生成的lib文件的位置 2011-06-22 11:37在Projet-Settings.的Link选项卡中Outp

21、ut file name中设置dll的输出路径Project options:中可以看到刚刚设置生成的DLL路径,紧跟着就是LIB文件的路径,默认应该是DEBUG或者release的目录下,这里需要手动修改LIB路径到你所需要的设置生成相应lib文件的所在路径,下面一句设置是Release模式下路径:/out:./UltrasoundWorkStation/PatientDBManage.dll /implib:./UltrasoundWorkStation/PatientDBManage.lib 下面是DEBUG模式下默认路径,这里未作修改。/out:Debug/PatientDBManag

22、e.dll/implib:Debug/PatientDBManage.lib /pdbtype:sept (多了一个这个)根据需要修改之即可。注意:这里 /implib:./UltrasoundWorkStation/PatientDBManage.lib 表示LIB生成路径为:当前DLL工程的上一级目录下的UltrasoundWorkStation文件夹位置下19. 加载DLL的方法主要有两种:一种是隐式链接,另外一种是动态加载。 隐式链接会把DLL中所有标志为_declspec(dllexport)的函数都加载,如果有多个DLL加载时,可能会影响到程序执行的效率。而用动态加载DLL的方式则

23、可以根据需要去加载用到的函数。 动态加载DLL的方法: 1.生成dll过程:把生成的.DLL文件复制到测试工程DLLTest目录下。这里假设该.DLL文件为add.dll,主要代码是:_declspec(dllexport) int add(int x, int y) return x + y; 2.使用1生成的dll:在DLLTest工程中添加DllTest.cpp文件.首先使用LoadLibrary(add.dll)加载add.dll文件:HMODULE hmod = LoadLibrary(add.dll); 然后定义一个函数指针的类型:typedef int (*AddAddr)(in

24、t x, int y); 注意,这里的参数与返回类型务必与add.dll文件中函数add的声明一样。 接着:AddAddr Add = (AddAddr)GetProcAddress(hmod, add); 如果Add值为空,则获取函数的地址失败!if(!Add) printf(获取函数地址失败!); return; 最后,可以测试一下:printf(test add(): 1+2=%d, add(1,2); 运行结果一看,会出现“获取函数地址失败!”。为什么会这样? 打开命令行,用cd命令到add.dll工程目录的debug目录下,然后使用命令:dumpbin -exports add.dl

25、l 则会看到add.dll文件中的add函数的名称为“?addYAHHHZ”,而不是函数名add,这是C+编译器的命名改编机制。 修改原来的代码:AddAddr Add = (AddAddr)GetProcAddress(hmod, ?addYAHHHZ);这时运行就成功了。但如果按这样去动态加载DLL,那每次获取函数地址都要使用dumpbin命令去获取,则会很麻烦。 那怎样可以直接使用add而不是 ?addYAHHHZ这个长长的字符串呢,修改add.dll的add函数,在函数前加上extern C,再编译add.dll文件所在的工程,复制新生成的add.dll覆盖DLLTest工程目录下的a

26、dd.dll,原来的代码获取函数地址时使用add,结果运行就成功了。 而再使用dumpbin -exports add.dll命令,显示add.dll的中的add函数的名称变成了add.20一个函数将CPtrList里所有记录读出来:POSITION pos = apStr.GetHeadPosition();while(pos != NULL) str = apStr.GetNext(pos); / 这里,你就可以使用str了21.OpenCVcvReleaseImage属于cxcore.lib#pragma comment(lib,cxcore.lib)cvWaitKeycvShowIma

27、gecvMoveWindowcvNameWindowcvLoadImage都在highgui.lib22.让console程序不显示控制台在默认情况下链接器看到/subsystem下是windows选项的时候,它会自动寻找winmain或者wwinmain但我们强制指定入口地址,这样运行程序的时候默认的console窗口就会隐藏!上面是在代码中使用#pragma指令来设置,还有一种就是直接在开发环境的project-setting-link-project option中手工改动!写了这么多,自己都有点感觉乱,没有办法,以前没写过什么文章,所以措辞可能不太好,希望大家见谅。1:如果consol

28、e程序已经写好了,不能改了,也可以。写一个API程序,不要画窗口,然后用CreateProcess调用写好的console程序,把属性设成SW_HIDE即可。2:不能用控制台来写(CONSLOE),要用WINMAIN做入口就可以了,不画窗口,别人就都看不见了. 你只用想想办法把你的进程在任务栏里面隐藏住就可以.3:如果是console程序,用API函数GetStdHandle()获得控制台程序的窗口句柄,然后在隐藏窗口4:/这一句隐藏控制台 #pragma comment(linker, /subsystem:windows /entry:mainCRTStartup ) 23.console

29、接收输入,即使console在后台 while(1) int key=cvWaitKey(10); if(key=27) break; if(key = -1) continue; printf(%c,key); 24.创建弹出菜单并响应消息CMenu menu; menu.CreatePopupMenu(); ClientToScreen(&point);menu.AppendMenu(MF_STRING,WM_DESTROY, Exit ); menu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this); menu.DestroyMenu();需要使用ON_COMMAND来响应消息命令可以在resource.h中定义例如#define ID_ALERT WM_USER+100025.通过发消息在Notepad中写字 HWND m_LocalWnd =:FindWindow(Notepad,NULL); HWND m_ChildWnd = :FindWindowEx(m_LocalWnd, NULL,Edit,); :PostMessage(m_ChildWnd,WM_CHAR,A,0); :PostMessage(m_ChildWnd,W

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1