【问题解决】无法在动态链接库上定位程序输入点~(程序en
最近我开始重新开始一些视觉工作。从您自己的笔记本电脑上配置的工作环境开始。关于opencv的编译和配置,当时主要参考的是下面这篇博文。现在在vs环境中再次开始使用opencv。首先使用最简单的highgui功能熟悉一下使用流程,测试一下库是否有问题。然后我就真的发现了问题所在。第一反应是tbb.dll的路径配置不正确。如果出现错误,debug版本的dll也会出现类似的问题。不知道啥时候自带的呢,额,替换之或删除之,问题即可解决。xhr.responseText表示服务器返回的数据,xhr.statusText表示状态码对应的状态信息。
最近我开始重新开始一些视觉工作。 从您自己的笔记本电脑上配置的工作环境开始。
工作环境:win7 32bit + vs2010 + opencv244
关于opencv的编译和配置,当时主要参考的是下面这篇博文。
----------------------------------
现在在vs环境中再次开始使用opencv。 首先使用最简单的highgui功能熟悉一下使用流程,测试一下库是否有问题。 然后我就真的发现了问题所在。
1、debug下,库配置正确,运行正常,没有问题。
2.release下,库配置也是正确的,但是生成后运行时,出现问题:
第一反应是tbb.dll的路径配置不正确。 所以检查系统设置下环境变量中的path项下tbb.dll的路径是否输入正确。 经过检查发现是正确的,应该是正确的。 如果出现错误,debug版本的dll也会出现类似的问题。
然后尝试将路径中的tbb.dll文件复制到项目的可执行文件.exe所在的路径下,重新运行项目,发现运行成功。
这次就更奇怪了。 感觉默认运行时调用的tbb.dll文件不是我要调用的版本。 这超出了我的能力,我需要帮助。
----------------------------------
1.在stackoverflow上,我发现了一个帖子,对“无法定位程序输入点”的问题有更好的描述
提到这个错误很有可能是因为生成exe时使用的lib文件版本与运行exe时调用的dll版本不一致。
考虑到我生成exe时使用的lib对应的dll文件确实存在,但是没有被正确调用,所以需要了解exe文件的搜索路径,以便在运行时找到并调用该dll文件。
2.通过百度找到博文的dll目录搜索序列
文章阐明了可执行文件在运行时查找和调用dll文件的路径搜索顺序。 一般来说:
A 可执行文件所在目录;
B 进程当前目录;
C 系统目录,%SystemRoot%/system32
D 16位系统目录;,%SystemRoot%/system
E Windows目录,%SystemRoot%/
F 环境变量PATH中的目录;
果不其然,我在自己电脑的C:\Windows\System32文件夹下发现了另外的tbb.dll。。。。不知道啥时候自带的呢,额,替换之或删除之,问题即可解决
3、从2中的博文可以看出,使用filemon监控工具是观察搜索路径顺序的好工具。
有时间请参考filemon监控工具的使用。 由于时间有限,我今天就跳过它。
4、msdn上的以下两篇文章帮助我重新整理了关于windows下动态链接库调用的知识。 在此我谨表达我的谢意。
前言
本文主要讲一下如何手写一个jquery ajax方法。 这是前端中的基础知识,也是一道非常经典的前端面试题!
手写ajax一步一步
网页中与后端通信的顺序一般是客户端向服务器发起请求,然后服务器回复客户端。 通信使用的工具是ajax。 如果你喜欢足球,那你一定知道荷甲还有一家巨型足球俱乐部叫阿贾克斯,同名。 Ajax 就像打电话一样,连接页面和服务器。 基本用法如下:
图1
从图1中我们可以看出$.ajax是一个函数,它的参数是一个对象,那么我们可以如下定义它:
var $ = {}; // 模拟jquery对象 $.ajax = function(options){ // 实现逻辑 }
接下来我们开始在函数中编写逻辑。
图2
如图2所示,ajax的关键是XMLHttpRequest对象,它提供了http协议的安全访问接口。 这里使用了它的两个方法和一个事件:
1)open方法第一个参数为请求类型:get、post、head等,第二个参数为请求的接口地址,第三个参数表示ajax请求是异步(true)还是同步(false),如果是异步的,ajax请求发送后js会继续执行,不会等待服务器响应。 我们一般选择异步来提高页面的渲染效率;
2)send方法只有一个参数,代表发送给服务器的参数,通常是一个对象;
3)onreadystatechange是一个事件,可以监控请求从开始到结束整个流程的状态。 状态保存在xhr的readyState属性中。
就绪状态:
从上面的readyState状态我们可以看出ajax只需要4个,其他状态其实都是失败!
另外,xhr的status属性代表服务器返回的状态码。 根据我们的经验,状态码400以上就有问题,要么是服务器问题,要么是客户端问题! 300到400之间的所有内容似乎都与重定向有关,除了一个 - 304。如果您了解浏览器缓存,您一定知道它与协商缓存有关。 其实就代表请求成功了! 另外,任何低于200的状态都需要请求者继续操作,这不符合要求! 总结一下,可用的状态码在200到300之间,再加上一个304!
好了,经过上面的分析,我们继续完善onreadystatechange事件的处理函数:
图3
如图3所示,我们在事件处理函数中编写了两个方法ajaxSuccess和ajaxError,分别执行ajax参数对象传入的success和error函数属性。 我们知道ajax对象参数中还有一个属性叫做complete。 这是一个方法。 无论请求成功与否都会执行,所以需要在ajaxSuccess和ajaxError中调用执行一次。 xhr.responseText表示服务器返回的数据,xhr.statusText表示状态码对应的状态信息。
接下来我们需要设置请求头,可以使用xhr.setRequestHeader来完成,如下:
图4
在图 4 中,我们对两个特殊请求标头(Accept 和 Content-type)进行了默认设置。 当我们使用post类型向服务器发送带参数请求时,content-type需要设置为application/x-www-form-urlencoded,其他请求头可以通过ajax对象的headers属性传入范围。 注意setRequestHeader方法需要在open方法之后调用!
在某些场景下,我们需要在发送请求之前进行一些逻辑判断。 如果不满足条件,我们需要阻止发送请求。 为了满足需求,我们需要在ajax调用open方法之前添加一个hook!
图5
在图5中,我们通过beforeSend函数的执行结果来判断是否需要取消请求!
此时其实还有一步没有完成,就是超时逻辑。 比如当网络不好的时候,我们就无法让页面保持在loading状态。 我们需要设置一个超时时间。 如果超过这个时间,就说明ajax请求失败了! 在开发超时需求时,我们最容易想到的就是使用定时器setTimeout。 现在我们来弥补一下吧!
图6
如图6所示,在超时的情况下,我们将onreadystatechange事件处理函数设置为空函数并放弃请求,然后执行error函数。 另外,在正常的onreadystatechange事件处理逻辑中,我们需要及时清除这个定时器!
至此,一个简单的ajax就已经开发完成了,现在直接使用demo就没有问题了!
常见面试问题
1.手写ajax?
如果你看到这个,我想应该就没有问题了!
2、如果请求被重定向,ajax将如何处理?
当然是进入误差函数啦!
3、如果请求超时,ajax会如何处理?
当然也进入了误差函数!
总结
本文手写的ajax可以直接在移动端使用,无需考虑PC兼容性! 根据我的经验,只要你会手写ajax,面试时遇到相关问题就不会被难倒。 这样的问题其实都是分! 另外,开发PC页面时,我们使用jquery,但是开发移动端时,我们应该使用zepto.js! 本篇文章到这里就结束了,下一篇继续写JSONP的实现!
如果喜欢我的文章,请关注我。 如果您有任何疑问,可以发表评论。 让我们一起学习、一起成长!