我在我的表单上放了一个TLinkLabel,用一个包含有效HTML链接的标题填充它,并得到一些漂亮的蓝色下划线文本.当我运行程序时,我希望它调用Firefox(我的默认浏览器)并自动打开链接.显然情况并非如此.
帮助文件说我必须在OnLinkClick事件处理程序中对此进行编码.但是,它没有说明如何做到这一点.它将传入一个名为"Link"的字符串值.我怎么说"调用默认浏览器并让它打开链接"?
最近我在使用FPU堆栈溢出时遇到了一些麻烦.我设法将它追溯到一个错误的库函数,每次调用它时都会将垃圾值推送到FPU堆栈,并且永远不会清理它.
幸运的是,这很容易重现,我确切地知道它导致了什么条件.我可以将一行内联ASM放入调用此例程的例程中,将最高值从FPU堆栈中弹回...除了我不太清楚要写什么.我的ASM-fu对于middlin来说是公平的,但不是那么强大.
那么在x86汇编中摆脱FPU堆栈顶部值的最简单方法是什么,假设它是垃圾数据并且我不关心它的值?
我收到一个错误报告,我的程序使用的外部DLL(SDL_Mixer,如果它有帮助)中的某些音乐播放代码中的某些功能正在提升EPrivilege.DLL是用C语言编写的,因此我无法通过MadExcept从中获取有用的堆栈跟踪信息,并且问题在我的最终无法重现.只是为了让事情变得更糟,我甚至不知道EPrivilege是什么.
我从来没有看到它出现在我自己的代码中,在网上提供的信息很少,而且有什么是矛盾的.(一种解释说,如果你试图用一个有限的帐户做一些需要不可用的权限的东西,操作系统会提出它,另一个解释说如果你试图执行一个高于你的权限级别的指令,它会由CPU引发.)
有没有人对导致EPrivilege的原因有权威的解释?并没有任何人有任何想法如何能够通过音乐播放代码,一台Windows 7 64位机器上的下一个非管理员帐户提出,但没有运行相同的代码时,可以提出我的下一个非Windows 7的64位计算机-admin帐号?
我正在编写一个脚本解释器,我已经设法进入工作状态.它有一个解析脚本并生成字节码的编译器,以及一个执行字节码的VM.
解释器的核心是一个带有巨大case语句的循环,看起来像这样:
case CurrentOpcode.Operation of
OP_1: DoOp1(CurrentOpcode);
OP_2: DoOp2(CurrentOpcode);
...
OP_N: DoOpN(CurrentOpcode);
end;
Run Code Online (Sandbox Code Playgroud)
分析告诉我,无论出于何种原因,我的脚本执行在该case语句中花费了大量时间,这对我来说似乎很奇怪,所以我正在寻找一种优化它的方法.显而易见的解决方案,因为所有操作函数基本上具有相同的签名,就是创建一个由操作码的Operation值索引的方法指针数组.但是Operation被声明为枚举,并且能够将其声明为const数组会很好,这样如果我将来添加更多的操作码,编译器可以提醒我更新数组.
由于方法指针存储运行时状态(Self对其运行的对象的引用),因此我无法创建方法指针的const数组.(无论如何,这也不是一个好主意,因为很可能我最终会同时运行多个脚本.)但方法只是语法糖.就像是:
procedure TMyObject.DoSomething(x, y: integer);
Run Code Online (Sandbox Code Playgroud)
真正意思:
procedure TMyObject_DoSomething(Self: TMyObject; x, y: integer);
Run Code Online (Sandbox Code Playgroud)
所以我应该能够在后一种形式中声明一个函数指针类型并以这种方式分配它,然后我只需要Self在调用它时作为第一个参数显式传递.但编译器并不喜欢这样.
type TOpcodeProc = procedure (Self: TScriptVM; Opcode: TOpcode);
const OPCODE: TOpcodeProc = TScriptVM.DoOp1;
[DCC Error]: E2009 Incompatible types: 'regular procedure and method pointer'
Run Code Online (Sandbox Code Playgroud)
我已经尝试了不同的变体来尝试让它编译,但它们都会给出错误.有没有办法让这个编译?
如果我将类型定义为枚举类型的集合,则使用[]创建空集很容易,但如何创建完整集?
编辑:是的,显而易见的解决方案是使用for循环.如果有另一种方式,这也是一个非常糟糕的解决方案.有谁知道一种在恒定时间内工作的方式?
我最近买了一台新笔记本电脑.不幸的是,它带有Vista.让它工作是一个很大的麻烦,并且comp有没有XP驱动程序的硬件组件,所以我不能"升级"到实际工作的操作系统.我大部分时间都在努力工作,但是一个特别奇怪的问题令我难过.
我安装了Delphi并尝试构建一个项目.它已编译,但不会运行."此应用程序无法启动,因为找不到sdl.dll." 很公平.所以我抓住SDL.dll并把它放在C:\windows\system32文件夹中.(使用Vista 64位家庭高级版.这是一个32位的dll,所以我把它放在32个文件夹而不是64个.)
再次点击运行.同样的问题.但为什么?它就在哪里,对吗?并且C:\windows\system32在系统路径中.任何人都知道为什么它无法链接到DLL?
(是的,我知道我可以通过将DLL放在与.exe相同的文件夹中来解决这个问题.我目前正在将其作为一种解决方法.但从长远来看,这是一个坏主意,因为我有一些都需要SDL的不同项目.)
我正在查看SDL库中的一些代码,并遇到了一个声明如下的函数:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Run Code Online (Sandbox Code Playgroud)
现在,我是德尔福编码器.没有hablo C muy bien,先生.但是我记得我的大学课程中有足够的语法来读它:
函数名称是WndProc.参数列表非常明显.函数返回类型是LRESULT.但是世界上那个"CALLBACK"在那里做什么呢?在Delphi中,任何函数都可以用作回调函数; 你只需要传递正确类型的函数指针.有什么特别的原因导致C不能这样工作吗?或者它意味着什么不同?
找到所有外部依赖项很容易.只需运行程序并打开模块信息窗口即可.但是我怎样才能找到所有内部依赖项?我知道程序会保留所有单元的列表,因为我已经在初始化代码中跟踪了一两次.但有没有简单的方法从调试器访问此列表?
这可能听起来像一个奇怪的问题,我实际上不得不问这个问题感觉有点奇怪,但是花了几个小时查看MSDN文档以了解bcryptVista中添加的例程,我几乎得出结论:没有实际的bcrypt支持!
根据维基百科:
bcrypt是一个基于Blowfish密码的密码的自适应加密哈希函数...除了结合盐来防止彩虹表攻击之外,bcrypt是一个自适应哈希:随着时间的推移,它可以变得越来越慢,所以它仍然具有抵抗力针对哈希和盐的特定暴力搜索攻击.
但是,从MSDN上的文档来看,"bcrypt"库显然实际上是加密和散列的通用接口.您必须通过BCryptOpenAlgorithmProvider函数获取"算法提供程序"的句柄,该函数有几个内置算法可供选择.但是"河豚"这个词并没有出现在名单的任何地方.
我错过了什么吗?我读错了吗?或者Windows的"bcrypt"库实际上不支持bcrypt吗?
我有一个自定义控件,它本质上是一个绘图画布,以及一个用它来编辑文件的程序.但是,当打开一个新文件时,会发生一些非常奇怪的事情.
如果用户在"打开文件"对话框(标准TOpenDialog控件)中双击文件而不是选择项目并点击ENTER,则下面的画布会注册一个单击事件,并在加载后立即在光标位置执行绘制操作.完成.
显然,这不是预期的行为.之前我注意到,当您双击鼠标时,双击消息会在第二次单击消息之前到达.我认为对话框可能会从双击中关闭,然后第二次单击消息到达并被发送到适当坐标处的任何内容,因为它已经消失了.
有什么方法可以让这个停止发生吗?我无法告诉我的代码"加载后,只需吃下一次点击",因为它可能已经用"ENTER"键打开,然后它将错过第一次合法点击.谁能想到更好的方法来处理这个问题?(使用Windows 7,以防它有所作为.)