整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

html(网页)运行本地程序(exe文件)的方法与源码

信大家在使用一些软件的时候会发现,只要点击了它们的一些网页广告就会运行一些推广软件或者是官方软件。它们是怎么实现的呢?其实方法很简单,听来群网慢慢道来。

下面链接是微软MSDN上的说明,为了大家易懂,所以在这里分享给大家:http://msdn.microsoft.com/en-us/library/aa767914%28v=vs.85%29.aspx

当然,或许还有更复杂的方法,小编只举一个简单的例子。

此方法分两部份:1. 注册表代码部份; 2. HTML代码部份

1.注册表代码:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\laiqun]
@="laiqun Protocol"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\laiqun\DefaultIcon]
@="C:\\WINDOWS\\NOTEPAD.EXE"
[HKEY_CLASSES_ROOT\>laiqun\shell]
@=""
[HKEY_CLASSES_ROOT\laiqun\shell\open]
@=""
[HKEY_CLASSES_ROOT\laiqun\shell\open\command]
@="\"C:\\WINDOWS\\NOTEPAD.EXE\" "

注释:laiqun代表链接前缀如:[laiqun://], 可修改为您想要的前缀。

C:\WINDOWS\NOTEPAD.EXE\ 代表需要执行EXE的路径(可执行文件),可替换您想运行的程序。

修改完后保存,将TXT文件重命名为【文件名.Reg】然后运行就加入注册表中(如下图)

注册表代码

2.html代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div>
<a href="laiqun://">此处文字按需修改</a>
</a>
</div>
</body>
</html>

把上面的html代码复制到notepad++,修改完成后点击保存,然后把TXT后缀修改成html即可(如下图)。

HTML代码

打开html文件点击里面的链接就能直接打开笔记本,我里面路径写的是记事本程序的路径,所以点击的时候是打开记事本,这个文件路径可以在注册表程序中修改。

注意:编辑代码建议使用 notepad++等专业文本编辑器,不建议使用电脑自带的记事本。

好了,关于 html(网页)运行本地程序(exe文件)的方法与源码 的教程就到这里,谢谢大家支持。

如果大家有什么不明白的地方,可以在下方评论、留言。

avaScript 是如何运行的?

几乎每个人都听说过 v8引擎这个概念,大多数人都知道 JavaScript 是单线程的,或者它使用的是回调队列。

执行 JavaScript 代码所涉及的核心组件包括运行时环境和浏览器,他们内部如何工作呢?

  • JavaScript Engine
  • JavaScript Runtime Environment
  • The Call Stack
  • Concurrency and Event Loop

JavaScript 是一种解释性编程脚本语言,JavaScript 引擎就是一个执行 JavaScript 代码的计算机程序:解释器,当 JavaScript 文件在浏览器中加载时,负责逐行解析代码,将其转换为机器代码,然后执行它。

每个浏览器都有自己的 JavaScript 引擎,但最著名的是 Google 的 v 8引擎。V8引擎不仅为 Google Chrome 提供动力,还为 Node.js 提供动力,这就是 JavaScript 运行时。

引擎由两个主要组件组成:

  • 内存堆(Memory Heap)ーー这是内存分配发生的地方
  • 调用堆栈(Call Stack)ーー这是代码执行时堆栈帧的位置

Call Stack调用堆栈:计算模型:栈下推自动机,图灵等价。

JS是一种单线程的编程语言,这意味着它只有一个 Call Stack。因此,它可以一次只做一件事。并且不必处理在多线程环境中出现的复杂场景(例如,死锁)。

调用堆栈是一种数据结构,它基本上记录我们在程序中的位置。如果我们进入一个函数,我们把它放在堆栈的顶部。如果我们从一个函数返回,我们将从堆栈顶部弹出。

运行时

JavaScript 引擎并不是孤立运行的。它和许多其他组件一起运行在一个叫做JavaScript Runtime Environment 中。

JRE 负责JavaScript 的异步执行。组件包含:

  • JS Engine, such as V8
  • Web API
  • Callback Queue or message queue
  • Event Table
  • Event loop

并发性和事件循环

虽然是单线程,为了处理多任务,需要并发交替执行,

并发、多线程、多进程、异步编程和事件循环等是一组相关概念,交织在PL和OS的中间。

首先,并发性是一个概念,它能够无序地处理多个任务。任务一般分为计算密集和读写密集。

real world,一个餐厅,一排人点菜后,后厨出菜就是无序的,有的菜工序复杂就得多等,这就是异步,同步就是先来后到一个个上完菜。

实现并发性的技术很多,包括多线程、多进程和异步编程。

异步编程, 比如node.js并发性 使用的异步 i/o,将 i/o 操作移交给操作系统内核,并将 i/o 操作的回调推迟。异步io这个任务就放在事件循环队列进行调度。

由此各组件基本解释一番。

击右上方红色按钮关注“小郑搞码事”,每天都能学到知识,搞懂一个问题!

先来看这段代码,大家看表示什么意思。

一眼看过去,非常熟悉,通常我们会这样理解:这段代码表示1秒后,会执行setTimeout里面那个函数。

然而,这种解释并不准确, 那应该怎么理解呢? 我们先来理解JavaScript的远行机制。

本文最后我会给出JavaScript的运行机制完整图。但在这之前,我想先来给大家解释几个问题。

1. JavaScript为什么是单线程的?

JavaScript设计的初衷是用在浏览器中, 那么,我们来想象一下,如果JavaScript是多线程的话。

必然可以有两个进程,process1和process2,那么这两个进程可以同时对同一个DOM进行操作。如果这个时候,一个进程要删除这个DOM,另一个进程要编辑这个DOM。启不是矛盾嘛。

所以,这样应该更好理解,JS为什么是单线程了。

2. JavaScript为什么需要异步?

单线程为什么需要异步呢?

JavaScript如果不存在异步,而是自上而下执行,这样的话,假如上一行解析时间很长,那么下面的代码直接就会被阻塞。这种现象对于用户来说,意味着"卡死"。严重影响用户流失,这样解释好理解吧,所以JavaScript需要异步处理。

3. 单线程如何实现异步呢?

JavaScript竟然需要异步,那么它是如何实现异步的呢?

JavaScript是通过事件循环(event loop)来实现的,事件循环机制也就是今天要说的JavaScript运行机制。

(一)同步任务和异步任务

来看一段代码:

首先这段代码输出结果是啥?

输出:1 3 2

其中setTimeout需要延迟一段时间才去执行,这类代码就是异步代码。

看到这个结果,所以通常我们都这么理解JS的执行原理:

第一,判断JS是同步还是异步,同步进入主线程,异步则进入event table。

第二,异步任务在event table中注册函数,当满足触发条件后,被推入event queue(事件队列)。

第三,同步任务进入主线程后一直执行,直到主线程空闲,才会去event queue中查看是否有可执行的异步任务,如果有就推入主线程。

按到这个逻辑,上面这段实例代码,是不是就很好理解了。1,3是同步任务进入主要线程,自上而下执行,2是异步任务,满足触发条件后,推入事件队列,等待主线程有空时调用。

(二)宏任务(macro-task)和微任务(micro-task)

然而,按照同步和异步任务来理解JS的运行机制似乎并不准确。

来看一段代码。看看它的输出顺序。

上面这段代码,按同步和异步的理解,输出结果是:2,4,1,3。因为2,4是同步任务,按顺序在主线程自上而下执行,而1,3是异步任务,按顺序在主线程有空后自先而后执行。

可事实输出并不是这个结果,而是这样的:2,4,3,1。为什么呢?来理解一下宏任务和微任务。

宠任务:包括整体script代码,setTimeout,setInterval。

微任务:Promise,process.nextTick。

来看原理图:

嗯,对,这就是JS的运行机制。也就是事件循环。解释一下:

第一,执行一个宏任务(主线程的同步script代码),过程中如果遇到微任务,就将其放到微任务的事件队列里。

第二,当前宏任务执行完成后,会查微任务的事件队列,将将全部的微任务依次执行完,再去依次执行宏任务事件队列。

上面代码中promise的then是一微任务,因此它的执行在setTimeout之前。

需要注意的是:在node环境下,process.nextTick的优先级高于promise。也就是可以简单理解为,在宏任务结束后会先执行微任务队列中的nextTickQueue部分,然后才会执行微任务中的promise部分。

所以最后总结一下,对于文章一开头提到的那段代码,我们可以准确的理解为:

1秒后,setTimeout里的函数会被推入event queue,而event queue(事件队列)里的任务,只有在主线程空闲时才会执行。也就是需要同时满足两个条件(1)1秒后。(2)主线程必须空闲,这样1秒后才会执行该函数。

现在,关于JavaScript的运行机制,大家应该都理解了,有问题欢迎留言。