鉴于大家对于SkeyePlayer插件的使用还不太熟悉,特此写一篇插件的使用文档,供大家参考;SkeyePlayer插件有两种,一种是基于IE的ActiveX控件,一种是基于FireFox(也支持多浏览器)的npAPI插件;两种插件均包含源码,由于FireBreath框架生成代码比较多,npAPI插件只包含关键代码,后续会提供专门讲解FireBreath生成SkeyePlayer npAPI插件的文档,下面我们开始讲解两种插件如何使用。
在Visual Studio 200X下,CString直接转换成const char* 有点困难,下面是自己用的一种可行方案:
智能合约是一种计算机协议,用一段计算机指令实现自我验证、自动执行,并产生可以验证的证据来证明合约操作的有效性。
DotNet4应用程序打包工具(把DotNet4安装程序打包进你的应用程序;WINAPI开发,无dotNet环境也可顺利执行)【一】整体思路
被涮屏涮烦了,就分享一下如何用低调的c/c++来涮别人家的屏吧! 此处埋下三颗雷! 这不是啥新知识,也不是什么浅显的代码。下面,来淘淘这份经验,呼呼 我们要了解Web browser 这个控件,因为到目前为止,很少有浏览器能够被调用内核API,而Web browser 提供了IE的内核内容,就是我们可以用Ie提供的内核来自己设计一个简单的浏览器 当然,我们这儿并不是扯这个蛋。 但是为了后面说起来比较合理些 ,就只能翻山越岭的开始介绍了! 首先创建一个dlg,然后点击Acx control ,如果看见了
CFileDialog文件选择对话框的使用:首先构造一个对象并提供对应的參数,构造函数原型例如以下: CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );參数意义例如以下:
例如: PathFileFileName( “c://Program Files//File.txt” ) = “File.txt”。
如何理解LPCTSTR类型? L表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。 P表示这是一个指针 C表示是一个常量 T表示在Win32环境中, 有一个_T宏 这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。 STR表示这个变量是一个字符串 所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。 同样, LPCSTR就只能是一个ANSI字符串,在程序中我们大部分时间要使用带T的类型定义。 LPCTSTR == const TCHAR * CString 和 LPCTSTR 可以说通用。 原因在于CString定义的自动类型转换,没什么奇特的,最简单的C++操作符重载而已。 常量字符串ansi和unicode的区分是由宏_T来决定的。但是用_T("abcd")时, 字符串"abcd"就会根据编译时的是否定一_UNICODE来决定是char* 还是 w_char*。 同样,TCHAR 也是相同目的字符宏。 看看定义就明白了。简单起见,下面只介绍 ansi 的情况,unicode 可以类推。 ansi情况下,LPCTSTR 就是 const char*, 是常量字符串(不能修改的)。 而LPTSTR 就是 char*, 即普通字符串(非常量,可修改的)。 这两种都是基本类型, 而CString 是 C++类, 兼容这两种基本类型是最起码的任务了。 由于const char* 最简单(常量,不涉及内存变更,操作迅速), CString 直接定义了一个类型转换函数 operator LPCTSTR() {......}, 直接返回他所维护的字符串。 当你需要一个const char* 而传入了CString时, C++编译器自动调用 CString重载的操作符 LPCTSTR()来进行隐式的类型转换。 当需要CString , 而传入了 const char* 时(其实 char* 也可以),C++编译器则自动调用CString的构造函数来构造临时的 CString对象。 因此CString 和 LPCTSTR 基本可以通用。 但是 LPTSTR又不同了,他是 char*, 意味着你随时可能修改里面的数据,这就需要内存管理了(如字符串变长,原来的存贮空间就不够了,则需要重新调整分配内存)。 所以 不能随便的将 const char* 强制转换成 char* 使用。 楼主举的例子 LPSTR lpstr = (LPSTR)(LPCTSTR)string; 就是这种不安全的使用方法。 这个地方使用的是强制类型转换,你都强制转换了,C++编译器当然不会拒绝你,但同时他也认为你确实知道自己要做的是什么。因此是不会给出警告的。 强制的任意类型转换是C(++)的一项强大之处,但也是一大弊端。这一问题在 vc6 以后的版本(仅针对vc而言)中得到逐步的改进(你需要更明确的类型转换声明)。 其实在很多地方都可以看到类似 LPSTR lpstr = (LPSTR)(LPCTSTR)string; 地用法,这种情况一般是函数的约束定义不够完善的原因, 比如一个函数接受一个字符串参数的输入,里面对该字符串又没有任何的修改,那么该参数就应该定义成 const char*, 但是很多初学者弄不清const地用法,或者是懒, 总之就是随意写成了 char* 。 这样子传入CString时就需要强制的转换一下。 这种做法是不安全的,也是不被建议的用法,你必须完全明白、确认该字符串没有被修改。 CString 转换到 LPTSTR (char*), 预定的做法是调用CString的GetBuffer函数,使用完毕之后一般都要再调用ReleaseBuffer函数来确认修改 (某些情况下也有不调用ReleaseBuffer的,同样你需要非常明确为什么这么做时才能这样子处理,一般应用环境可以不考虑这种情况)。 同时需要注意的是, 在GetBuffer 和 ReleaseBuffer之间,CString分配了内存交由你来处理,因此不能再调用其他的CString函数。 CString 转LPCTSTR: CString cStr; const char *lpctStr=(LPCTSTR)cStr; LPCTSTR转CString: LPCTSTR lpctStr; CString cStr=lpctStr;
ini文件在Win95以前比较盛行,之后由于出册表等技术的出现,ini技术主键退居二线,不过对于一些小项目,读写ini文件还是很适用的。
进程通常上被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动,一个程序可以对应多个进程。
项目中需要读取注册表中的HKEY_CLASSES_ROOT主键下一个子键的值,看了看MSDN的说明,有RegOpenKeyEx和RegQueryValueEx两个函数可以用。也没仔细阅读函数说明,就写了一段简单的代码来测试: HKEY hKey; WCHAR szLocation[MAX_PATH] = {'\0'}; DWORD dwSize = sizeof(DWORD); DWORD dwType = REG_SZ; LPCTSTR studioPath = TEXT("insta360\
备注Converts this CString object to an uppercase string.
COM组件是跨语言的,组件被注册到注册表中,在加载时由加载函数在注册表中查找到对应模块的路径并进行相关加载。它的存储规则如下: 1. 在注册表的HKEY_CLASSES_ROOT中以模块名的方式保存着COM模块的GUID,比如HKEY_CLASSES_ROOT\ADODB.Error\CLSID键中保存着模块ADODB.Error的GUID为{00000541-0000-0010-8000-00AA006D2EA4} 2. 在HKEY_CLASSES_ROOT\CLSID中以GUID为项名保存着对应组件的详细信息,比如之前的{00000541-0000-0010-8000-00AA006D2EA4}这个GUID在注册表中的位置为HKEY_CLASSES_ROOT\CLSID\{00000541-0000-0010-8000-00AA006D2EA4}\InprocServer32\项的默认键中保存着模块所在路径为%CommonProgramFiles%\System\ado\msado15.dll 一般的COM模块都是使用regsvr32程序注册到注册表中,该程序在注册时会在模块中查找DllRegisterServer函数,卸载时调用模块中提供的DllUnregisterServer,所以要实现注册的功能主要需要实现这两个函数 这两个函数的原型如下:
进程从来不执行任何东西,它只是纯种的容器,若要使进行完成某项操作,它必 须拥有一个在它的环境中运行的纯种,此线程负责执行包含在进程的地址空 间的中的代码.也就是,真正完成代码执行的是线程,而进程只是纯种的容器, 或者说是线程的执行环境.
今天又收到了一个开发者的反馈,也是比较有代表性的,刚好拿出来跟大家分享一下。具体需求是这样的:有用户在使用EasyDSS产品时,想要集成播放器在业务系统中,需要整合ie active x控件播放RTMP直播流,同时需要兼容IE8浏览器。
#include <windows.h> #include <iostream> #define STRLEN 20 typedef struct _DATA { DWORD dwLoadLibrary; DWORD dwGetProcAddress; DWORD dwGetModuleHandle; DWORD dwGetModuleFileName; char User32Dll[STRLEN]; char MessageBox[STRLEN];
共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信。因为是通过内存操作实现通信,因此是一种最高效的数据交换方法。
这两个函数是ArxDbgUtils类中的成员函数,用于获取字典对象的ID。下面是对这两个函数的注释和分析:
Visual C++.NET涉及到ATL/ATL Server、MFC和托管C++等多种编程方式,不仅功能强大而且应用广泛。在编程中,我们常常会遇到ANSI、Unicode以及BSTR不同编码类 型的字符串转换操作。本文先介绍基本字符串类型,然后说明相关的类,如CComBSTR、_bstr_t、CStringT等,最后讨论它们的转换方法, 其中还包括使用最新ATL7.0的转换类和宏,如CA2CT、CA2TEX等。
在编程中,针对磁盘与目录的操作也是非常重要的,本章将重点介绍如何实现针对文件目录与磁盘的操作方法,其中包括了删除文件,文件拷贝,文件读写,目录遍历输出,遍历磁盘容量信息,磁盘格式化,输出分区表数据,监控目录变化等。
FindWindow // 查找对话框 HWND hMainWnd = ::FindWindow(_T("#32770"), _T("标题")); // 查找记事本 HWND hMainWnd = ::FindWindow(_T("Notepad"), _T("无标题 - 记事本")); // 查找计算器 HWND hMainWnd = ::FindWindow(_T("CalcFrame"), _T("计算器")); // 函数原型 HWND WINAPI FindWindow( _In_opt_
本篇文章讲解的是开发 Windows Mobile 上的今日插件。关于是今日插件,在 PPC 或者 SP SDK 的帮助文档中有相关的章节介绍,在网络上也有一些帖子和资源讲解。在这里简要回顾一下。今日插件就是在windows mobile的桌面上显示的条目,例如系统提供的“日历”(Calendar),主人信息,以及许多第三方开发的今日插件等等。由于桌面是开机后的第一个屏幕,所以插件显示在屏幕上将会得到用户最多的浏览时间。这里我们主要讲解的是用户自定义插件的开发。自定义插件如下图所示:
返回值 =-1:出现错误 =0:调用成功但是没有出现子进程 >0:成功退出的子进程的id
LPCTSTR lpExistingFileName, // pointer to name of an existing file LPCTSTR lpNewFileName, // pointer to filename to copy to BOOL bFailIfExists // flag for operation if file exists ); 当中各參数的意义: LPCTSTR lpExistingFileName, // 你要拷贝的源文件名称 LPCTSTR lpNewFileName, // 你要拷贝的目标文件名称 BOOL bFailIfExists // 假设目标已经存在,不拷贝(True)并返回False,覆盖目标(false)
LPCTSTR pszDllName = OcxFileName ; //ActiveX控件的路径及文件名
引言 众所周知,在调试、跟踪和执行应用程序的过程中,程序的日志能为这些工作提供大量有价值的运行信息。因此,程序的日志对应用程序的运行、维护至关重要。 在如何记录程序日志方面,通常有三种选择: 1、采用Log4CXX等公共开源日志组件:这类日志组件的特点是跨平台且功能比较强大,例如可以把日志发往另一台服务器或记录到数据库中等; 另外,可配置性较高,可以通过配置文件或程序代码对日志进行很多个性化设置。但从另外一个角度看,由于这些优点往往也导致了在使用方面的缺点。首先,对于 一般应用程序来说,它们并不
可以通过这个方法,把CDuiString变为LPCTSTR ; 所以下一步只是如何把LPCTSTR 转为string了。
在vs2008中新建一个VC++的空项目 在解决方案资源管理器,源文件文件夹中添加一个CPP文件 在此文件中输入以下代码
EAT(Export Address Table)用于修改动态链接库(DLL)中导出函数的调用。与IAT Hook不同,EAT Hook是在DLL自身中进行钩子操作,而不是修改应用程序的导入表。它的原理是通过修改DLL的导出函数地址,将原本要导出的函数指向另一个自定义的函数。这样,在应用程序调用DLL的导出函数时,实际上会执行自定义的函数。
服务程序是windows上重要的一类程序,它们虽然不与用户进行界面交互,但是它们对于系统有着重要的意义。windows上为了管理服务程序提供了一个特别的程序:服务控制管理程序,系统上关于服务控制管理的API基本上都与这个程序打交道。下面通过对服务程序的操作来说明这些API函数
Windows注册表操作基础代码 Windows下对注册表进行操作使用的一段基础代码Reg.h: #pragma once #include<assert.h> #include<windows.h> class Reg { HKEY hkey; public: void open(HKEY root,char*subKey);//打开注册表键,不存在则创建 void del(HKEY root,char*subKey);//删除注册表键 void close();//关闭注册表键
大家好,又见面了,我是你们的朋友全栈君。 1 int SHFileOperation( LPSHFILEOPSTRUCT lpFileOp); 如果执行成功返回0. 1 typedef struct _SHFILEOPSTRUCT { 2 HWND hwnd;//指向发送消息的窗口 3 UINT wFunc;//执行的操作 4 LPCTSTR pFrom;//源文件名 5 LPCTSTR pTo;//目标文件名 6 FILEOP_FLAGS fFlags;//操作与确认标识 7
一、服务(Service) 服务程序是NT系统支持的一种可执行文件,通常服务程序不与用户进行交互,在系统启动时会自动启动服务程序。所有的服务程序都由SCM进行管理,每个服务程序必须符合SCM所定义的规范。
本文转载自WinExec, ShellExecute,CreateProcess 区别 其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。
最近遇到了一个困难。下的一部视频,有100来集,但每一集都放在单独的文件夹里。我现在想把他们移到一起,莫非要一个一个手工移?
权限提升 #include <Windows.h> #include <stdio.h> BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege) { TOKEN_PRIVILEGES tp; HANDLE hToken; LUID luid; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); Look
工作中,QA同学在测试我们程序的时候,发现在XP下,我们的A进程无法启动我们的B进程。而在Win7 64bit系统下功能正常。RD同学调试后,发现我们A进程中使用ShellExcute去启动了B进程(转载请指明出于breaksoftware的csdn博客)
WinExec是一个WIN32 API,它的第一个参数必须包含一个可执行文件名,
假设用MFC的话,请尽量使用afxmessagebox,由于这个全局的对话框最安全,也最方便。 可是在WIN32 SDK的情况下仅仅能使用MESSAGEBOX。
函数型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName); IpClassName :指向一个指定了类名的空结束字符串或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。如果为NULL,将会寻找任何与lpWindowName参数匹配的窗口,IpWindowName:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为空,则为所有窗口全匹配。 返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL。
SCShell是无文件横向移动工具,它依赖ChangeServiceConfigA来运行命令。该工具的优点在于它不会针对SMB执行身份验证。一切都通过DCERPC执行。无需创建服务,而只需通过ChangeServiceConfigAAPI 远程打开服务并修改二进制路径名即可(所以要事先知道目标上的服务名称)。支持py和exe两种文件类型。
CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL ); 参数意义如下: bOpenFileDialog 为TRUE则显示打开对话框,为FAL
1. MessageBox(str);很简单的一个函数,该函数参数为字符串.用来弹出一个窗口显示str的内容,str为一个字符串.
Windows编程中,对所有的GUI组件和控件进行了分类,每种类型的实例对象都具有不同的特性,这些特性包括UI外观以及事件的处理和响应的方法。就和面向对象技术中的类和实例对象一样,Windows中也提供了窗口类和窗口实例的概念,在创建一个窗口对象是必须要指定对应的窗口类名称,所有的窗口类必须要先注册到系统中才能进行实例化创建。系统内部默认注册了一些窗口类,比如按钮,编辑框这些窗口类等等。本文所要介绍的就是那些针对窗口类进行操作的API。一个窗口类其实就是定义了这种窗口实例的外观显示的样式、光标在窗口上移动时的样式、以及图标样式、背景绘制的画刷的类型、菜单、以及对应的UI事件处理函数等等。为了唯一的表征一个窗口类,还需要为窗口类指定一个唯一的字符串名称。下面的结构体就是用来描述一个窗口类所应该具有的数据结构:
管 道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另 一进程就可以从管道的另一端将其读取出来。匿名管道(Anonymous Pipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。
最近做C++相关的项目,遇到同时使用COM和MSXML来解析XML文件中信息的问题,这类问题如果做MFC开发也会经常用到。 在网上搜了一整圈,确实很难找到可用的code,总算自己研究出高效而简单的方法,借此机会总结一下,并分享给大家。
通过上一篇文章.我们理解了虚拟内存与物理内存的区别. 那么我们有API事专门申请虚拟内存与物理内存的.
领取专属 10元无门槛券
手把手带您无忧上云