归档: 2017

dcef3加载flash闪烁问题简单解决方法

dcef3添加flash插件后,在播放flash时会有一个dos的黑框一闪而过,显示not sandboxed,影响使用体验! 一种方法是hook 具体可以看这篇文章 http://blog.csdn.net/zx2356/article/details/51514403这篇文章是使用的C语言,这儿采用同样的方法,在delphi中实现!代码如下HookExt.pas源码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100unit HookExt; interfaceuses uhook,Windows,SysUtils; type TFuncCreateProcessA = function(lpApplicationName: LPCSTR; lpCommandLine: LPSTR; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: LPCSTR; const lpStartupInfo: TStartupInfoA; var lpProcessInformation: TProcessInformation): BOOL; stdcall; TFuncCreateProcessW = function(lpApplicationName: LPCWSTR; lpCommandLine: LPWSTR; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: LPCWSTR; const lpStartupInfo: TStartupInfoW; var lpProcessInformation: TProcessInformation): BOOL; stdcall; implementation var hhk: HHook; MapFile: THandle; startPID: PDWORD; Hook: array [0 .. 1] of TNtHookClass; function NewCreateProcessA(lpApplicationName: LPCSTR; lpCommandLine: LPSTR; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: LPCSTR; const lpStartupInfo: TStartupInfoA; var lpProcessInformation: TProcessInformation): BOOL; stdcall;var strCommandLine: AnsiString;begin strCommandLine := StrPas(lpCommandLine); if (Pos('echo NOT SANDBOXED',strCommandLine)>0) or (Pos('no-sandbox',strCommandLine)>0) then Result := True else begin Hook[0].UnHook; Result := TFuncCreateProcessA(Hook[0].BaseAddr)(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation); Hook[0].Hook; end;end; function NewCreateProcessW(lpApplicationName: LPCWSTR; lpCommandLine: LPWSTR; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: LPCWSTR; const lpStartupInfo: TStartupInfoW; var lpProcessInformation: TProcessInformation): BOOL; stdcall;var strCommandLine: string;begin strCommandLine := StrPas(lpCommandLine); if (Pos('echo NOT SANDBOXED',strCommandLine)>0) or (Pos('no-sandbox',strCommandLine)>0) then Result := True else begin Hook[1].UnHook; Result := TFuncCreateProcessW(Hook[1].BaseAddr)(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation); Hook[1].Hook; end;end; // 安装API Hookprocedure InitHook;begin Hook[0] := TNtHookClass.Create('kernel32.dll', 'CreateProcessA', @NewCreateProcessA); Hook[1] := TNtHookClass.Create('kernel32.dll', 'CreateProcessW', @NewCreateProcessW); // Hook[2] := TNtHookClass.Create( 'user32.dll', 'MessageBoxA', @NewMessageBoxA );end; // 删除API Hookprocedure UnInitHook;var i: Integer;begin for i := 0 to High(Hook) do FreeAndNil(Hook[i]);end; // 环境处理procedure DllEntry(dwReason: DWORD);begin case dwReason of DLL_PROCESS_ATTACH: InitHook; DLL_PROCESS_DETACH: UnInitHook; end;end; initialization InitHook; finalization UnInitHook;end. 其中的uHook.pas源码:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788unit uHook; interface usesWindows, Messages, SysUtils;type TNtJmpCode = packed record MovEax: Byte; Addr: DWORD; JmpCode: Word; dwReserved: Byte; end; TNtHookClass = class(TObject) private hProcess: THandle; NewAddr: TNtJmpCode; OldAddr: array [0 .. 7] of Byte; ReadOk: Boolean; public BaseAddr: Pointer; constructor Create(const ADllName, AFuncName: string; ANewFunc: Pointer); destructor Destroy; override; procedure Hook; procedure UnHook; end; implementation { TNtHookClass } constructor TNtHookClass.Create(const ADllName, AFuncName: string; ANewFunc: Pointer);var dllModule: HMODULE; lpNumberOfBytesReacd: DWORD; //NativeUInt; i:Integer;begin // 获取模块句柄 dllModule := GetModuleHandle(PWideChar(ADllName)); if dllModule = 0 then dllModule := LoadLibrary(PWideChar(ADllName)); // 得到模块入口地址 BaseAddr := Pointer(GetProcAddress(dllModule, PWideChar(AFuncName))); // 获取当前进程句柄 hProcess := GetCurrentProcess; // 指向新地址的指针 NewAddr.MovEax := $B8; NewAddr.Addr := DWORD(ANewFunc); NewAddr.JmpCode := $E0FF; // 保存原始地址 ReadOk:=ReadProcessMemory(hProcess, BaseAddr, Pointer(@OldAddr), 8, lpNumberOfBytesReacd); // 开始拦截 Hook; end; destructor TNtHookClass.Destroy;begin UnHook; CloseHandle(hProcess); inherited;end; procedure TNtHookClass.Hook;var lpNumberOfBytesRead: DWORD;begin if not ReadOk then exit; // 写入新的地址 WriteProcessMemory(hProcess, BaseAddr, @NewAddr, 8, lpNumberOfBytesRead);end; procedure TNtHookClass.UnHook;var lpNumberOfBytesRead: DWORD;begin if not ReadOk then exit; // 恢复地址 WriteProcessMemory(hProcess, BaseAddr, @OldAddr, 8, lpNumberOfBytesRead); end; end. 这种hook处理不好就容易蓝屏,更简单的方法如下:用二进制编辑软件,比如winhex,我这儿采用UltraEdit,用UltraEdit打开flash插件dll文件 pepflashplayer.dll 搜索comspec修改为somspec,(修改的名字只要和comspec不相同即可)修改cmd.exe为cm1.exe (修改的名字只要和cmd.exe不相同即可) 修改后为 然后保存即可,这时打开flash就不会有dos黑框闪一下了! 第三种方法,更简单,什么都不用修改,只要在你的程序目录下新建一个文本文件,然后改名为cmd.exe,因为弹出黑框需要使用cmd程序,而系统搜索程序是从进程当前的工作目录开始查找,所以直接这样建一个不能执行的cmd.exe文件可以拦截cmd的调用。这个方法最简单! 第一种hook方法是修改flash文件,但其实是采用动态方法改了汇编代码,处理不好容易蓝屏。第二种方法修改flash插件文件,原理是:flash执行cmd的逻辑是,先读取环境变量comspec(cmd.exe的全路径),读取到就执行它,读取不到就不执行cmd.exe.只要把变量和cmd.exe名字修改,就执行不成功,就没有DOS黑框出来!第一种方法是在flash插件要运行cmd.exe的时候再进行拦截,是动态修改的,而第二种是直接让flash找不到变量和cmd.exe程序,flash自己判断不用执行,是静态修改!第三种是懒人方法!但几种方法实现的效果都是阻止cmd.exe的正常执行!同时你就可以这样思考了,为了让flash不出现闪黑框的问题,就变成了如何阻止cmd.exe的执行,比如你在你自己的程序中先修改一下comspec环境变量,也是可以阻止cmd.exe执行的,大家自由发挥!

如何自定义修改TChromium的header头信息!

TChromium自定义post的header信息提交数据1234567891011121314151617181920212223242526272829uses ceflib; function CreateField(const AValue: AnsiString): ICefPostDataElement;begin Result := TCefPostDataElementRef.New; Result.SetToBytes(Length(AValue), PAnsiChar(AValue));end; procedure TForm1.Button1Click(Sender: TObject);var Header: ICefStringMultimap; Data: ICefPostData; Request: ICefRequest;begin Header := TCefStringMultimapOwn.Create; Header.Append('Content-Type', 'application/x-www-form-urlencoded'); Data := TCefPostDataRef.New; Data.AddElement(CreateField('Data.id=27')); Data.AddElement(CreateField('&Data.title=title')); Data.AddElement(CreateField('&Data.body=body')); Request := TCefRequestRef.New; Request.Flags := WUR_FLAG_NONE; Request.Assign('http://example.com/', 'POST', Data, Header); Chromium1.Browser.MainFrame.LoadRequest(Request);end; 在另一版本中的代码1234567891011121314151617181920212223procedure TForm1.Button1Click(Sender: TObject);var Header: ICefStringMultimap; Data: ICefPostData; Request: ICefRequest;begin Request := TCefRequestRef.New; Request.Url := 'http://example.com/'; Request.Method := 'POST'; Request.Flags := WUR_FLAG_NONE; Header := TCefStringMultimapOwn.Create; Header.Append('Content-Type', 'application/x-www-form-urlencoded'); Request.SetHeaderMap(Header); Data := TCefPostDataRef.New; Data.AddElement(CreateField('Data.id=27')); Data.AddElement(CreateField('&Data.title=title')); Data.AddElement(CreateField('&Data.body=body')); Request.PostData := Data; Chromium1.Browser.MainFrame.LoadRequest(Request);end; TChromium自定义post数据123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051function CreateField(const AValue: AnsiString): ICefPostDataElement;begin Result := TCefPostDataElementRef.New; Result.SetToBytes(Length(AValue), PAnsiChar(AValue));end; //***************************************** procedure POST(total, fee: integer);var Header: ICefStringMultimap; Data: ICefPostData; Request: ICefRequest; Cook: ICefCookieManager;begin Request := TCefRequestRef.New; Request.Url := ''; Request.Method := 'POST'; Request.Flags:=[UR_FLAG_ALLOW_CACHED_CREDENTIALS,UR_FLAG_ALLOW_COOKIES]; Header := TCefStringMultimapOwn.Create; Header.Append('Host', ''); Header.Append('User-Agent', ''); Header.Append('Accept', ''); Header.Append('Accept-Language', ''); Header.Append('Accept-Encoding', ''); Header.Append('Content-Type', ''); Header.Append('Referer', ''); Header.Append('Content-Length', ''); Header.Append('Origin', ''); Header.Append('Connection', ''); Header.Append('Pragma', ''); Header.Append('Cache-Control', ''); Header.Append('Cookie','...'); ... Header.Append('Cookie','...'); Request.SetHeaderMap(Header); Data := TCefPostDataRef.New; Data.AddElement(CreateField('sessionid='+SessionID)); Data.AddElement(CreateField('¤cy=5')); Data.AddElement(CreateField('&subtotal='+inttostr(total-fee))); Data.AddElement(CreateField('&fee='+IntToStr(fee))); Data.AddElement(CreateField('&total='+IntToStr(total))); Request.PostData := Data; form1.Chromium1.Browser.MainFrame.LoadRequest(Request);end;

如何让dcef3支持mp3和h.264_mp4解码播放(有源码及dll)!

嵌入式Chromium框架(简称CEF) 是一个由Marshall Greenblatt在2008建立的开源项目,它主要目的是开发一个基于Google Chromium的Webbrowser控件。CEF支持一系列的编程语言和操作系统,并且能很容易地整合到新的或已有的工程中去。它的设计思想政治就是易用且兼顾性能。CEF基本的框架包含C/C++程序接口,通过本地库的接口来实现,而这个库则会隔离宿主程序和Chromium&Webkit的操作细节。它在浏览器控件和宿主程序之间提供紧密的整合,它支持用户插件,协议,javascript对象以及javascript扩展,宿主程序可以随意地控件资源下载,导航,下下文内容和打印等,并且可以跟Google Chrome浏览器一起,支持高性能和Html5 技术 为什么chromium不支持mp3和h.264的mp4音视频解码,因为h.264编码并非开源,是需要付费的!所以就存在谷歌自己的浏览器chrome能支持mp4和tchromium不支持mp4!如何查看你的tchromium是否支持mp4呢?你用tchromium写一个简单浏览器,然后打开http://html5test.com 支持是这样显示的 而不支持是这样显示的 也就是支持h.264 support mp3 support和aac support应该是钩! 要让cef支持mp3和mp4,需要自己编译,如果你对自己如何编辑有兴趣可以看这篇文件 在Windows下编译Cef3.2623并加入mp3、mp4支持 对于delphi用户,如何让在delphi中dcef3支持mp3和mp4呢?先到这儿下载dcef3 3.2623.1401 http://download.csdn.net/download/cyu/9917747 (如果没有积分就到这儿下载 链接:https://pan.baidu.com/s/1dFETI0L 密码:gult ) 你也可以安装dcefbrowser,封装后的dcef3 这儿下载dcefbrowser3.2623.1401 https://github.com/bccsafe/DcefBrowser (你也可以到这儿下载dcefbrowser 链接:https://pan.baidu.com/s/1dFB5Zv7 密码:fljs )不管你是下载的dcef3 3.2623.1401 还是下载的dcefbrowser 3.2623.1401都可以,安装控件后,运行示例程序,这时你的dcef是不支持mp3和mp4的,为什么呢?因为h.264等编码问题,作者打包的dll库文件是默认不支持mp3和mp4的! 如何让delphi中dcef3支持mp3和mp4呢?你只需要到这儿下载 链接:https://pan.baidu.com/s/1c1DZ1DY 密码:sqir 已经编译好支持mp3和mp4的dll库,覆盖到前面安装的控件中,就OK了,因为这个dll库是对应于dcef3.2623.1401,所以dcef必须也要安装3.26.23.1401。如何让delphi中dcef3支持mp3和mp4呢?因为非开源问题,所以自己编译dcef3的dll库的不多,提供下载的也不多,为了让你的dcef3支持mp3和mp4,我们只要找对应的版本就可以使用了!为什么非要指定dcef3为3.2623.1401,这是因为编译cef的dll需要开启mp3和mp4支持,网上提供其他版本的cef的dll库,并且加入了支持mp3和mp4的没有,如果你会C++,会自己编译cef的库,那什么版本都一样,都可以支持mp3和mp4 附dcef3另一版本及库文件:dcef3.2454 下载http://download.csdn.net/download/bigcoolfish/9616325 相对应已添加支持mp3和mp4的 dcef3.2454 dll库文件下载 https://pan.baidu.com/s/1pKHbeY3 密码: mxr2

如何查出桌面的弹出窗口是谁创建的?

做为PC系统,很大一部份是使用的windows,windows的广告软件很多,不小心就会在桌面上弹出一个窗口,凭肉眼,用任务管理器,很难看出是哪个程序创建的弹出窗口,本文件介绍用句柄精灵ViewWizard找出桌面弹出窗口是什么程序创建的!来看看桌面出现的这个弹出窗口在开机运行QQ后不久就在桌面右下角弹出这个窗口,任务栏没有任何程序出现! 打开 句柄精灵ViewWizard (下载句柄精灵请到 http://www.bnwin.com/2017/11/03/202.html) 界面如下 鼠标按住 句柄精灵的 十字图标拖到这个弹出的窗口上! 这时句柄精灵就显示出来这个程序的所有信息 这个窗口的模块是 C:\Users\Administrator\AppData\Local\Temp\QXREPAIR1.DLL 往下面拉,看看进程是谁 exe执行文件在 C:\Users\Administrator\AppData\Local\Temp\PZYTOOLS\XFIXER.exe 是由谁创建的呢?父进程是 916 [svchost.exe] 找到了是谁创建的,是什么进程,就可以相应的进行控制了!你可以禁止XFIXER.exe的运行,或者禁止svchost.exe在temp目录创建xfixer.exe文件等! 你也可以根据句柄精灵提供的窗口信息进行自动关闭!对于这种有独立进程的弹出窗口你可能通过任务管理器也能查找到,虽然没有使用句柄精灵方便,但通过其他程序加载dll库文件弹出的窗口,通过任务管理器就无能为力了! 我们来看看英雄联盟选择英雄时左边的窗口是谁创建的 打开句柄精灵,拖动十字图标到这个窗口上,看看句柄精灵中的信息 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121属性 数据基本>句柄 67140 [0x00010644]文本长度 0类名 TWINCONTROL基类 Generic描述 通用窗口ID *数据 0x130B9478字节 *实例 *模块 I:\游戏辅助\TGP腾讯游戏平台网吧版\apps\Pallas\pallas.exe父窗>句柄 [65552]文本 [Desktop]类名 [#32769]基类 [Generic]显示>状态 常规>可视 yes有效 yes置顶 yes分层 no透明 no重叠 no不活动 noUnicode yes密码框 no掩码不透明度 *Z序 3大小>窗口矩形 (1508,415)-(1810,798) 302×383还原矩形 (1508,415)-(1810,798) 302×383客户矩形(屏幕) (1508,415)-(1810,798) 302×383客户矩形(窗口) (0,0)-(302,383) 302×383最大化坐标 (0,0) 1920×1050最小最大尺寸 0x0 1930×1057当前窗口坐标当前客户坐标关系>父窗口 65552 [0x00010010] #32769 “Desktop”根窗口 *所有者窗口 *首个子窗口 *首兄弟窗口 394540 [0x0006052C] MSCTFIME UI “MSCTFIME UI”上一个窗口 918714 [0x000E04BA] IME “Default IME”下一个窗口 198612 [0x000307D4] Auto-Suggest Dropdown “”尾兄弟窗口 65812 [0x00010114] Progman “Program Manager”样式>标准样式 0x96020000 (2516713472)描述 WS_POPUP|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_GROUP控件扩展样式 0x00000088 (136)描述 WS_EX_TOPMOST|WS_EX_TOOLWINDOW控件类>类名 TWINCONTROL类原子 0xC2CC (49868)类字节 *窗口字节 *类样式 0x00000008 (8)描述 CS_DBLCLKS图标 *小图标 *光标 0x00010003 IDC_ARROW画刷 *菜单 *过程 0x55C1AD90 (1438756240) [Unicode]模块 0x00400000 (4194304)模块路径 I:\游戏辅助\TGP腾讯游戏平台网吧版\apps\Pallas\pallas.exe菜单>句柄 *子菜单所有子菜单菜单项菜单矩形字体>句柄 *名称大小粗体斜体删除线下划线字符集进程>进程ID 7060 [0x00001B94]线程ID 2560 [0x00000A00]进程启动 2017-11-26 16:32:06线程启动 2017-11-26 16:32:06内存使用 32,248 KB内存峰值 91,252 KB虚拟内存 82,008 KB线程计数 17句柄计数 324GUI对象 GDI:52, User:40映像名称 pallas.exeEXE路径 I:\游戏辅助\TGP腾讯游戏平台网吧版\apps\Pallas\pallas.exe物理路径 I:\游戏辅助\TGP腾讯游戏平台网吧版\apps\Pallas\pallas.exe命令行父进程 6444 [tgp_daemon.exe]文件>名称 pallas.exe大小 7390408版本 4.1.1.123版权 Copyright (C) 2015 Tencent.All Rights Reserved产品 WeGame公司 腾讯计算机系统有限公司描述 Tencent.WeGame.Pallas创建时间 2015-12-31 21:14:44统计>子窗口所有子窗口无效子窗口隐藏子窗口线程窗口 12进程窗口 12附加>基本类型 Generic (通用) 正确使用句柄精灵,可以找出广告程序等弹出窗口的幕后黑手!

如何让手机控制电脑之TeamViewer

TeamViewer是一个能在任何防火墙和NAT代理的后台用于远程控制,桌面共享和文件传输的简单且快速的解决方案。为了连接到另一台计算机,只需要在两台计算机上同时运行 TeamViewer 即可,而不需要进行安装(也可以选择安装,安装后可以设置开机运行)。该软件第一次启动在两台计算机上自动生成伙伴 ID。只需要输入你的伙伴的ID到TeamViewer,然后就会立即建立起连接。TeamViewer官方网站:https://www.teamviewer.com/zhCN/ 如何使用手机控制电脑呢? 在TeamViewer官方网站下载相应的App,比如Android版TeamViewer下载地址为https://play.google.com/store/apps/details?id=com.teamviewer.teamviewer.market.mobile,不过你可以直接在你的手机应用市场中搜索TeamViewer,也可以下载安装TeamViewer的app安装!Android手机安装成功运行的界面如下 在电脑中运行TeamViewer,界面如下: 只要在手机的伙伴ID处输入电脑端显示的ID,点击远程控制,输入电脑端的密码,就可以在手机中控制电脑了,连接成功后的界面如下 点继续后就可以操控电脑了 电脑端运行TeamViewer,每次运行,密码都不一样,为了便于控制,我们要设置一个固定的密码,实现无人值守!点击电脑端显示的密码,会弹出一个菜单,选择 设置预定义密码,界面如下 这样做了以后,只要在电脑中TeamViewer的其他菜单的选项点开,钩上随windows一同启动TeamViewer,就可以在手机上输入电脑端teamviewer的id和预设的固定密码,从手机控制电脑了!但这时你是不是觉得还不够方便?为了更自动化一些,我们需要注册一个TeamViewer的控制帐号!在手机端是不是有一个计算机选项卡,点击后有一个注册按钮,你只要注册了帐号,你第一次登录,teamviewer会发一封添加允许设备登录的邮件,也就是只有允许的设备才能使用,这样安全性就高了!允许的设备登录帐号后,就可以添加电脑端的ID和密码,以后在手机中,只要登录帐号,直接点击你预添加的计算机就可以控制了,不需要你记和输ID和密码! TeamViewer最新版需要授权许可才能使用 Teamviewer连接的原理主要分为三部分,分别是①如何根据ID找到要连接的电脑,②找到电脑之后如何内网间互联,③如何能操作对方的电脑。一、先说TeamViewer如何根据ID连接到对方: 1、运行TeamViewer 之后,电脑会先连接到TV的服务器,然后服务器对这台电脑分配一个唯一的ID。这个ID主要是以网卡的MAC地址为依据生成的,所以如果想给电脑换一个Teamviewer ID,只要修改一下MAC地址就行了。 2、当一个TeamViewer 连接另一个的时候,会先连接到服务器,通过ID与电脑的对应关系找到这台要连接的电脑。 二、如何建立内网对内网的连接: 如果连接的其中任一方是有公网IP的网络环境,双方的连接就启用P2P连接。双方是内网的情况, TeamViewer数据就会通过TeamViewer 自己的服务器进行中转。这也是TeamViewer 内网互通会在网络高峰期比较慢的原因。 三、如何操作被控机的鼠标与键盘。 原理与远程控制木马是一样的。这里远端指被控制的电脑。连接建立之后,远端的电脑图像压缩后发回本地,这样本地就能看到画面,本地进行键盘鼠标的等操作的动作封装成数据包发送给远端解开后还原成动作进行远程的模拟操作。远端反馈的画面通过压缩后继续发回给控制端。就远控的图像传输来说,早年远控都是直接进行JPEG截图后传输,所以速度不太理想。之后各种大牛延伸出很多很腻害的基于截图的方式的屏幕传输的算法,传输效率进一步提高,通常是先加载一个虚拟屏幕驱动,然后对屏幕做逐行扫描,然后计算变化的部分,之后只传输变化的部分。TeamViewer(版本9.0)也是支持虚拟屏幕驱动的,但是需要到设置中手动进行安装。

如何使unigui支持多文件上传-MultiFileUpload

unigui能上传文件,单只支持单文件上传,在unigui中如何实现多文件上传呢?MultiFileUpload提供了解决方案!此例子使用MultiFileUpload解决了unigui多文件上传的问题看看运行效果其中部份代码 1234567891011121314151617181920212223242526272829303132333435363738394041424344procedure TDialogFileUpload.UniFormClose(Sender: TObject; var Action: TCloseAction);var I: Integer;begin if FIsUploading then begin //正在上传,不允许退出 Action := caNone; ModalResult := mrNone; Exit; end; if ModalResult=mrOK then begin if FListFiles.Count=0 then begin MessageDlg('请选择文件并上传!',mtInformation,[mbOK],nil); Action := caNone; ModalResult := mrNone; Exit; end; for I := 0 to FListFiles.Count - 1 do begin if Integer(FListFiles.Objects[I])=0 then begin MessageDlg('请上传选择的文件!',mtInformation,[mbOK],nil); Action := caNone; ModalResult := mrNone; Exit; end; end; if Assigned(FOnGetUploadFiles) then begin FOnGetUploadFiles(Self,FListFiles,FListFileSizes); end; end; //关闭时清除所有文件 FListFiles.Clear; FListFileSizes.Clear; UniSession.AddJS('panelUpload.onRemove();');end; 源码下载地址:链接: https://pan.baidu.com/s/1JYlHKLu2WZHXIc3MdNez7Q 提取码: srz4 复制这段内容后打开百度网盘手机App,操作更方便哦

使用plupload和fineuploader组件强化unigui文件上传功能!

unigui有上传组件,但功能不强,要想实现强大的功能,那么就得使用其他组件,以下介绍unigui中使用plupload和fineuploader上传文件 unigui使用前端上传组件plupload上传文件,改进文件上传,显示文件上传进度先看看效果图片 Plupload有以下功能和特点: 1、拥有多种上传方式:HTML5、flash、silverlight以及传统的。Plupload会自动侦测当前的环境,选择最合适的上传方式,并且会优先使用HTML5的方式。所以你完全不用去操心当前的浏览器支持哪些上传方式,Plupload会自动为你选择最合适的方式。 2、支持以拖拽的方式来选取要上传的文件 3、支持在前端压缩图片,即在图片文件还未上传之前就对它进行压缩 4、可以直接读取原生的文件数据,这样的好处就是例如可以在图片文件还未上传之前就能把它显示在页面上预览 5、支持把大文件切割成小片进行上传,因为有些浏览器对很大的文件比如几G的一些文件无法上传。 unigui使用前端上传组件fineuploader上传文件,增强文件上传先看看效果图片 Fine Uploader 采用ajax方式实现对文件上传.同时在浏览器中直接支持文件拖拽[对浏览器版本有要求类似IE版本必须是9或是更高的IE10].在不同浏览器中提供统一用户体验.该组件基本覆盖目前所有主流浏览器.同时没有任何第三方组件依赖.相当Clear.在服务器端已经覆盖支持了ASP.NET/ColdFusion/Java/Node.js/Perl/PHP/Python. 对上传细节类似限制文件大小,文件类型,文件上传的数量等通过统一接口以暴露选项方式操作.可以到这儿Github 上Fine Uploader 查看具体内容 delphi使用unigui源码下载地址链接: https://pan.baidu.com/s/10zOTt4eKqsDHnwHCDPp5ng 提取码: nenp 复制这段内容后打开百度网盘手机App,操作更方便哦

手工杀毒恶意代码检测工具PCHunter

PC Hunter是一个Windows系统信息查看软件,同时也是一个手工杀毒辅助软件。支持xp~win10的所有32位操作系统,还支持64位的Win7、Win8、Win8.1和Win10系统。看看界面主要功能:1.进程、线程、进程模块、进程窗口、进程内存信息查看,杀进程、杀线程、卸载模块等功能 2.内核驱动模块查看,支持内核驱动模块的内存拷贝 3.SSDT、Shadow SSDT、FSD、KBD、TCPIP、Nsiproxy、Tdx、Classpnp、Atapi、Acpi、SCSI、IDT、GDT信息查看,并能检测和恢复ssdt hook和inline hook 4.CreateProcess、CreateThread、LoadImage、CmpCallback、BugCheckCallback、Shutdown、Lego等近20多种Notify Routine信息查看,并支持对这些Notify Routine的删除 5.端口信息查看,目前不支持2000系统 6.查看消息钩子 7.内核模块的iat、eat、inline hook、patches检测和恢复 8.磁盘、卷、键盘、网络层等过滤驱动检测,并支持删除 9.注册表编辑 10.进程iat、eat、inline hook、patches检测和恢复

TChromium获取网页源代码delphi代码

使用Webbrowser取得网页源代码网上已经有很多例子了,而TChromium如何获得网页源代码呢? 第一种方法1234567891011procedure TCustomLoad.OnLoadEnd(const browser: ICefBrowser;const frame: ICefFrame; httpStatusCode: Integer);vardata:tstringlist;begindata:=tstringlist.create;if frame.IsMain thendata.text:=frame.Source; // HTML Sourceend;data.free;end; 在dcef3中123456789101112procedure StringVisitor(const str: ustring);begin//str is the SourceHtmlshowmessage(str);end;function GetSourceHTML: string;varCefStringVisitor:ICefStringVisitor;beginCefStringVisitor := TCefFastStringVisitor.Create(StringVisitor);Chromium1.Browser.MainFrame.GetSource(CefStringVisitor);end; 第三种1Chromium1.Browser.MainFrame.ViewSource;

unigui管理系统源码

uniGui是一款delphi开发网页应用的框架,完全基于ExtJs,全面支持ajax技术,是delphi开发bs程序的有力控件!官方网站为 http://www.unigui.com unigui的demo运行方法网址介绍地址http://www.unigui.com/resources/running-demos uniGUI为Delphi开发者在IDE上的Web应用程序设计创建、调试提供一套独特的视觉元素。每个组件的设计是为了提供在Delphi VCL可视化组件的对应相同的功能。这提供了一个非常舒适的开发环境,非常接近原生VCL应用开发的一个简单的学习过程。uniGUI Web应用程序可以部署到服务器上使用一个可用的部署选项,如Windows服务,独立服务器或ISAPI模块。 本源码是在uniguiv0.95的基础上开发的,如果你用最新的unigui版本,可能需要一些修改才能运行! 以下是引导说明界面其中的部份代码 123456789101112131415161718192021222324252627282930313233343536373839404142procedure TMainForm.InsertFrame(acaption:string);var tabs:TUniTabSheet;begin if (MM1.LoginUserid<>'') then //判断登录 begin if acaption='添加帐号' then begin try UniFrame3:=TUniFrame3.Create(Self); UniFrame3.Align:=alClient; except ShowActiveTab('添加帐号'); exit; end; tabs:=TUniTabSheet.Create(Self); tabs.PageControl:=pg1; tabs.Caption:='添加帐号'; tabs.Closable:=True; pg1.ActivePage:=tabs; UniFrame3.Parent:=tabs; UniFrame3.ParentWindow:=MainForm.Handle; end; if acaption='系统设置' then begin try UniFrame4:=TUniFrame4.Create(Self); UniFrame4.Align:=alClient; except ShowActiveTab('系统设置'); exit; end; tabs:=TUniTabSheet.Create(Self); tabs.PageControl:=pg1; tabs.Caption:='系统设置'; tabs.Closable:=True; pg1.ActivePage:=tabs; UniFrame4.Parent:=tabs; UniFrame4.ParentWindow:=MainForm.Handle; end; end;end; 提供的源代码可以用于学习unigui!此unigui源码动态生成tab,鼠标长时间不动自动锁界面等值得借鉴,你只需要修改一下代码就可以做为自己web系统的框架,添加功能继续开发!下载后运行bin目录中的安装,就可以点 打开 看到界面了,可以自己注册帐号,默认有一个帐号admin admin 下载地址:链接: https://pan.baidu.com/s/1PMRYEB96MYH6VYrYnHrEaQ 提取码: cyfe 复制这段内容后打开百度网盘手机App,操作更方便哦