尽管经过多年的Delphi编程,我还是遇到了一个我从未见过的类声明样式,它支持IUnknown:
TBCUnknown = class(TBCBaseObject, IUnKnown)
private
FRefCount: integer;
FOwner : Pointer;
protected
function IUnknown.QueryInterface = NonDelegatingQueryInterface;
function IUnknown._AddRef = NonDelegatingAddRef;
function IUnknown._Release = NonDelegatingRelease;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
...
Run Code Online (Sandbox Code Playgroud)
如您所见,IOUnknown接口方法的类方法的赋值正在类声明中完成.这看起来很奇怪,特别是因为我没有看到在调用构造函数之前如何分配IUnknown方法.这是一种编译时快捷方式,用于在类的方法和类接受的接口的接口指针之间进行分配,稍后在运行时解析吗?如果有人可以提供一些关于它是如何工作的信息以及Delphi成语支持这种构造我想知道的.
我有一个Delphi 6应用程序,像大多数Windows应用程序一样,读取/写入用户的"本地应用程序数据"文件夹中的数据.我使用下面的代码来确定该文件夹.到目前为止,该代码适用于我的大多数用户.我遇到了一个用户,其本地应用程序数据不在预期的文件夹中:
C:\Users\Bob\AppData\Roaming\
Run Code Online (Sandbox Code Playgroud)
通常本地应用程序数据文件夹解析为:
C:\Documents and Settings\Bob\Application Data\
Run Code Online (Sandbox Code Playgroud)
这个用户的特殊情况有多奇怪,通常在HKEY_LOCAL_MACHINE中找到的几个注册表项实际上位于HKEY_CURRENT_USER中.它们在Windows 7上运行.
由于缺乏更好的词,有没有办法为用户获取"真正的"应用程序数据,以便我可以更好地导航这种情况?如果是在CSIDL_APPDATA,CSIDL_COMMON_APPDATA和CSIDL_LOCAL_APPDATA特殊文件夹之间进行智能选择的问题,那么这样做的逻辑是什么?正如您所知,我正在寻找一个能够根除正确的应用程序数据文件夹的通用功能,无论用户运行的Windows版本或其特定的PC配置如何.
我发现这个Stack Overflow帖子似乎有答案但是它使用的是.NET库中的函数而我正在使用Delphi 6.如果这个解决方案回答了我的问题,有人可以告诉我一个快速的方法在Delphi中复制它:
如何获取当前用户的"Application Data"文件夹的路径?
// Function to get the app data special folder.
function GetAppdataFolder: string;
begin
Result := GetSpecialFolderLocation(CSIDL_APPDATA);
end;
Run Code Online (Sandbox Code Playgroud) 在VS2012设计器中剪切和粘贴控件时,有没有办法维护事件处理程序分配?例如,我有一个图形控件,其中包含事件存根中的代码的Load事件.如果我剪切并粘贴图形控件,则Load事件不再显示为在"属性编辑器"中具有事件处理程序分配.我必须使用Load事件旁边的下拉框来重新选择Load事件的现有事件处理程序代码(重做赋值).有没有办法剪切和粘贴控件而不会丢失事件处理程序分配?
在Delphi中,我可以自由剪切和粘贴控件,事件处理程序分配是剪贴板文本的一部分,因此当控件粘贴到窗体或框架上时它们会被保留.我希望有一种方法可以对Visual Studio 2012和C#项目做同样的事情.
我有一个使用WebMatrix 3创建的ASP.NET网站.我确实在VS2013中选中了使用64位版本的IIS Express,因为我在64位Windows 8.1上运行.当我尝试启动项目时,我收到错误"操作在当前状态下不合法".有人知道如何解决这个问题吗?
如果有人在主VCL线程和后台线程上运行时间代码有很多经验,我想得到一个意见.我有一些代码在主线程上的Delphi 6应用程序中运行一些繁重的字符串处理.每次运行操作时,每个操作的时间在i5 Quad内核的单个线程上徘徊大约50 ms.让我真正怀疑的是,我在旧Pentium 4上运行的相同代码显示了同样的操作时间,因为通常我看到Pentium 4上运行的代码比Quad Core慢4倍.我开始怀疑代码是否可能消耗的时间远远少于50毫秒但是主要的VCL线程,可能是Windows消息处理或执行Windows API调用,正在为操作创建一个人为的"底层".注意,如果重要,则由套接字上的传入请求触发操作,但是在完全接收数据之前不会进行时间测量.
在我开始将所有代码移到后台线程进行测试之前,我想知道是否有人对此领域有任何一般知识?您在主VCL线程上运行代码的经历是什么?注意,当测试期间绝对没有用户触发的活动时,正在进行定时测量.
我也想知道如果将线程的优先级提高到实时性以下是否会有任何好处.在尝试使用这些标志时,我的运行时间从未见过太多改进.
- roschler
我正在使用Delphi 6 Pro.我需要一个事件,当我的应用程序肯定关闭但在任何表单被销毁之前将触发.我想过在主窗体WndProc()中捕获WM_QUIT消息,但这不起作用,因为在我看到WM_QUIT消息之前,Forms开始销毁.我想知道是否有一个标准的Delphi事件,我可以用它来执行关闭事件链的这一点?我不能使用主窗体的FormClose()事件,因为它不能保证触发,并且FormDestroy()事件为时已晚.有任何想法吗?
这种情况不止一次发生在我身上,导致许多人失去了追逐幽灵的时间.通常,当我调试一些非常困难的与时序相关的代码时,我开始添加大量的OutputDebugString()调用,因此我可以很好地了解相关操作的顺序.问题是,Delphi 6 IDE似乎只能处理这种情况这么久.我将使用一个具体的例子,我只是为了避免一般性(尽可能多).
我花了几天时间调试我的线程间信号量锁定代码以及我的DirectShow时间戳计算代码,这导致了一些非常令人沮丧的问题.在消除了我能想到的每一个错误之后,我仍然遇到了Skype的问题,我的应用程序发送了音频.
大约10秒钟之后,我在谈话和听到我的声音之间的延迟来自于我用于测试的第二台PC上的Skype,呼叫的远端开始增长.在大约20-30秒时,延迟开始呈指数级增长,此时触发的代码我检查了一个关键部分是否持有时间过长.
幸运的是,它并没有太晚,并且在此之前经历过这一切,我决定停止无情地跟踪并关闭大部分的OutputDebugString().值得庆幸的是,我将大部分内容包装在条件编译器定义中,因此很容易做到.我这样做的那一刻问题消失了,事实证明我的代码工作正常.
因此,当OutputDebugstring()流量超过某个阈值时,看起来Delphi 6 IDE开始陷入困境.也许只是向事件日志调试器窗格添加字符串的任务,该窗格包含所有OutputDebugString()报告.我不知道,但是当TMemo或类似控件开始包含太多字符串时,我在应用程序中看到了类似的问题.
那些人为了防止这种情况做了什么?有没有办法通过某种方法调用清除事件日志或至少是限制其大小的方法?此外,您通过条件定义,IDE插件或其他什么技术来应对这种情况?
有没有办法序列化生成器,当前状态和所有(局部变量等),以便您可以稍后加载包含序列化生成器的字符串,并能够从最后一个yield语句退出函数的位置接收?如果是,并且您知道带有代码示例的网页,请分享指向它的链接.
我现在已经设置了Windows Azure环境,以便可以使用远程桌面访问我的工作者角色.但是,我不知道目前该怎么办.经过大量挖掘后,我发现一个离线的网站,但在Google的缓存中,提到了从Visual Studio调试器附加到Azure云中运行的辅助角色.但我只有Visual Developer(不是工作室)2010,我已经搜遍了所有,据我所知,没有这样的选项可以连接到远程服务器.我可以毫无错误地将我的项目发布到Azure云,并且我有一个"健康"的工作者角色实例显示为活动并正在运行.
我通过Azure管理门户连接了RDP.登录工作正常,远程桌面窗口出现了.我搜索了很多我能找到的东西,却无法找到我的工人角色.我必须对RDP有错误的印象,因为我希望在登录时看到Worker Role的主要显示形式,就像我在Cloud Emulator中本地调试它一样.但我所看到的只是一个空白的桌面,有一些基本级别的服务器检查和管理例程.我甚至检查了事件查看器中的应用程序相关消息,但没有看到.
所以现在我不知道我的工作者角色是否真的在运行,尽管来自管理门户的看似积极的状态消息,我仍然希望通过Visual Developer附加到我的工作者角色,如果有可能,但我我无法弄清楚如何.
任何有这方面经验的人都可以给我一些关于下一步该做什么的可靠提示,请回复.
更新:我相信我的工作者角色可能正在运行,因为我打开了一个命令窗口并做了一个Netstat并看到它正在侦听正确的端口.但是,这可能只是我的Worker Role shell类启动自定义EXE我将它作为生成的进程启动.我还没有确认我的自定义EXE是否还在运行.
UPDATE-2:刚从命令窗口运行TaskList,列出了自定义EXE.
更新-3:一切正常,因为我刚刚对服务进行了远程测试,所以这不是问题.仍然想知道如何从Visual Developer 2010附加到Worker角色以进行远程调试,并且如果可以在Cloud Emulator中进行本地调试时看到自定义EXE的显示形式.
- roschler
我有一个Delphi表单,它提供了一个接口对象背后的功能,代码的其他部分也通过属于Form的属性获得引用.我无法将接口功能委托给子对象,因为窗体上的控件/组件提供了太多的功能.我不能使用TAggregatedObject或TContainedObject来链接传递给接口的对象的生命周期,因为TForm类不继承TinterfacedObject而Delphi不支持多重继承,所以我不能将TInterfacedObject混合到继承链中.如果表单被销毁而某些其他代码包含表单传递的一个接口引用,则这种情况可能导致访问冲突.谁能想到这个问题的好方法呢?