小编Rob*_*edy的帖子

如何调用指向成员的指针函数?

我收到了一个我不明白的编译错误(MS VS 2008).在弄乱了好几个小时之后,这一切都很模糊,我觉得有一些非常明显(而且非常愚蠢)的东西,我很想念.这是基本代码:

typedef int (C::*PFN)(int);

struct MAP_ENTRY
    {
    int id;
    PFN pfn;
    };

class C
    {
    ...
    int Dispatch(int, int);
    MAP_ENTRY *pMap;
    ...
    };

int C::Dispatch(int id, int val)
    {
    for (MAP_ENTRY *p = pMap; p->id != 0; ++p)
        {
        if (p->id == id)
            return p->pfn(val);  // <--- error here
        }
    return 0;
    }
Run Code Online (Sandbox Code Playgroud)

编译器在箭头处声称"术语不评估为采用1参数的函数".为什么不?PFN原型为带有一个参数的函数,MAP_ENTRY.pfn是PFN.我在这里错过了什么?

c++ compiler-errors member-function-pointers

10
推荐指数
2
解决办法
2025
查看次数

如何让任务管理器不要杀死我的程序?

有没有办法保护我的Delphi应用程序不被Windows任务管理器(或其他像Process Explorer)杀死?

我认为Windows消息可以做到这一点(通过挂钩和拦截TerminateProcess消息).

我想要一个这种保护的例子.卡巴斯基反病毒套件就像这样; 我们无法在任务管理器中结束他们的流程.

windows delphi process messages taskmanager

10
推荐指数
3
解决办法
7770
查看次数

如果终止挂起的线程是个好主意,我该如何安全地进行?

我的Delphi程序在很大程度上依赖于Outlook自动化.2007-SP2之前的Outlook版本由于编写错误的插件和编写错误的Outlook代码而倾向于卡在内存中.

如果Outlook卡住,调用CreateOleObject('Outlook.Application')或GetActiveObject ...不会返回并保持我的应用程序挂起,直到任务管理器中的Outlook.exe关闭.

我想到了一个解决方案,但我不确定这是否是好的做法.

我在一个单独的线程中使用CreateOleObject启动Outlook,在我的主线程中等待10秒,如果Outlook挂起(CreateOleObject没有返回),则让用户从我的程序中终止Outlook.exe进程.

但是因为我不想强迫用户杀死Outlook.exe进程,作为替代方案,我还需要一种方法来杀死程序中的新线程,该线程现在一直挂起.

  1. 这是好习惯吗?
  2. 如何在不泄漏内存的情况下终止Delphi中的挂起线程?

delphi outlook automation multithreading

10
推荐指数
1
解决办法
1314
查看次数

我可以用Delphi设计网页吗?

我已经用Delphi编程了很长时间,我专注于桌面应用程序.我决定进入网页编程世界.我怎样才能拥有像Delphi这样的界面,但是有一个用于Web编程的脚本环境?有没有任何版本的Delphi我可以制作网页?

IntraWeb创建的应用程序可以作为整个站点上传吗?

delphi

10
推荐指数
3
解决办法
2万
查看次数

如何分隔INI文件中的部分?

保存到INI文件时,尤其是在定义了多个部分时,数据将一起保存,部分之间不存在任何行.

对于外部编辑,将每个部分与换行符分开会很方便,以便更容易查看和编辑INI文件.

例如:

标准Ini

[GENERAL]
value1=0
value2=somestring
[ADVANCED]
type=1
autosave=0
[OTHER]
showatstartup=1
Run Code Online (Sandbox Code Playgroud)

Ini有分隔线

[GENERAL]
value1=0
value2=somestring

[ADVANCED]
type=1
autosave=0

[OTHER]
showatstartup=1
Run Code Online (Sandbox Code Playgroud)

如何才能做到这一点?

delphi ini

10
推荐指数
2
解决办法
2241
查看次数

如何使用Boost制作关键部分?

对于我的跨平台应用程序,我已经开始使用Boost,但我无法理解如何实现代码来重现Win32的关键部分或.Net的行为lock.

我想编写一个Foo可以从不同线程调用的方法来控制对共享字段的写操作.应该允许同一线程内的递归调用(Foo() - > Foo()).

在C#中,这个实现非常简单:

object _synch = new object();
void Foo()
{
    lock (_synch)  // one thread can't be lock by him self, but another threads must wait untill
    {
        // do some works
        if (...) 
        {
           Foo();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ multithreading synchronization boost critical-section

10
推荐指数
1
解决办法
8548
查看次数

在Delphi的数字之前"$"是什么意思?

我正在尝试将Delphi代码转换为vb.net,我不确定这一行:

stream.Seek($42, soFromBeginning);
Run Code Online (Sandbox Code Playgroud)

我熟悉在文件流上使用搜索(在vb.net中),但我不确定$42.

我假设这对应于某个职位,但这又如何转化为vb.net?

vb.net delphi syntax

10
推荐指数
2
解决办法
1万
查看次数

如何将正数转换为负数?

如何使用Delphi将正整数转换为负数?我知道你可以使用ABS(int)将负数转换为正数,但我需要它将正数转换为负数.

delphi numbers

10
推荐指数
3
解决办法
5万
查看次数

如何激活显示为进度条的网格单元的就地编辑器?

我的DBTreeListView中的一个单元格绑定到作为进度条的存储库项目.

我希望能够通过单击此单元格来编辑显示的进度.在这个阶段,我的应用程序应该将其单元格更改为另一个存储库项目:一个文本字段,我将能够插入一个值.将焦点更改为另一个单元格后,应再次显示我的进度条,显示新值.我该怎么做呢?

DBTreeListView具有列事件OnGetEditingPropertyOnGetEditProperties.我可能会使用其中一个(或两个),但不能提出任何好主意.

delphi inplace-editing progress-bar

10
推荐指数
1
解决办法
799
查看次数

你如何检测到TEvent已被设置?

关于TEvent的Delphi XE2文档说明了这一点:

有时,您需要等待线程完成某些操作,而不是等待特定线程完成执行.为此,请使用事件对象.应使用全局范围创建事件对象(System.SyncObjs.TEvent),以便它们可以像所有线程可见的信号一样工作.

当线程完成其他线程所依赖的操作时,它会调用TEvent.SetEvent.SetEvent打开信号,因此任何其他检查的线程都会知道操作已完成.要关闭信号,请使用ResetEvent方法.

例如,考虑一种情况,您必须等待多个线程才能完成执行而不是单个线程.因为您不知道哪个线程最后会完成,所以您不能简单地使用其中一个线程的WaitFor方法.相反,您可以让每个线程在完成时递增一个计数器,并让最后一个线程信号通过设置事件来完成它们.

但是,Delphi文档没有解释另一个线程如何检测到调用了TEvent.Set事件.你能解释一下如何检查TEvent.Set是否被调用?

delphi multithreading

10
推荐指数
1
解决办法
3333
查看次数