小编Ste*_*eve的帖子

如何在Delphi中使用变量数组

我有两个Delphi7程序:一个COM自动化服务器(EXE)和另一个使用自动化服务器的程序.

我需要从一个程序传递一个字节数组到另一个程序.

经过一番搜索,我发现使用变体数组是可行的方法(如果你知道更好的方法,请纠正我).

我的问题是:如何在一个程序中创建变量数组,然后如何在另一个程序中读取它的值?

我知道VarArrayCreate和VarArrayLowBound/VarArrayHighBound,但我不确定如何正确地做到这一点.

谢谢!

arrays delphi automation delphi-7 variant

19
推荐指数
2
解决办法
4万
查看次数

Vista/7下使用Delphi 7的原生提示/工具提示?

我试图使用Delphi7在Windows Vista/7下重现本机提示/工具提示.

我找到了一个可以解决问题的好组件,但它只能部分工作.TListView组件的工具提示未显示.屏幕闪烁一秒钟但没有显示工具提示.

如何在Windows中使用Delphi 7显示本机工具提示?

delphi tooltip delphi-7 windows-7

17
推荐指数
1
解决办法
1169
查看次数

在Windows注册表中隐藏密钥的最佳位置?

我的Delphi程序具有内置保护机制,用于检查Internet上禁止的许可证密钥,并在找到列入黑名单的密钥时向用户显示消息.

我想将列入黑名单的密钥存储在注册表中,因此如果用户尝试重新输入(并且他/她未连接到Internet),则不会接受.

在Windows注册表中隐藏模糊条目的最佳方法是什么?

谢谢!


编辑:你们在那里有一些很好的答案,但我觉得我需要扩展这个问题.

这不是主流软件,而是企业软件.客户预先支付一年并获得一年的许可证密钥以进行激活.许可证密钥包含计算机ID,不能在其他地方使用.

问题是有些客户往往不及时付款或根本不付款.由于我不想打扰短于一年的许可证密钥(太多的管理开销),我需要一种方法来禁用他们的许可证,直到他们支付.

因此,应用程序现在将在启动时连接到Internet并检查其密钥是否已列入黑名单.如果是,我需要禁用访问权限.如果他们重新安装或阻止Internet访问,我需要知道密钥是否已被列入黑名单.

因此,我认为最好将其隐藏在注册表中.我的用户并不擅长使用注册表工具来监控注册表,但如果我把它放在HKLM/Software/MyCompany/MyProgram下,他们中的一些人可能会找到它.所以我需要一个他们之后无法找到它的地方.(没有人会期待它!)

有任何想法吗?

delphi registry winapi

14
推荐指数
2
解决办法
8947
查看次数

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

我的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
查看次数

自动或手动释放TThread

我的程序中有一个主线程和一个单独的线程.如果单独的线程在主线程之前完成,它应该自动释放.如果主线程首先完成,它应该释放单独的线程.

我知道FreeOnTerminate,我读过你必须小心使用它.

我的问题是,以下代码是否正确?

procedure TMyThread.Execute;
begin
  ... Do some processing

  Synchronize(ThreadFinished);

  if Terminated then exit;

  FreeOnTerminate := true;
end;

procedure TMyThread.ThreadFinished;
begin
  MainForm.MyThreadReady := true;
end;

procedure TMainForm.Create;
begin
  MyThreadReady := false;

  MyThread := TMyThread.Create(false);
end;

procedure TMainForm.Close;
begin
  if not MyThreadReady then
  begin
    MyThread.Terminate;
    MyThread.WaitFor;
    MyThread.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

delphi multithreading delphi-7 tthread

9
推荐指数
2
解决办法
5299
查看次数

文件更新时的Delphi通知

我的应用包含其数据库中的文档.用户可以打开文档,在这种情况下,文档将保存到临时文件夹并在用户的计算机上打开.

我希望在更改其中一个临时文件时收到通知,并提供用户将更改的文档保存回数据库.

在Delphi7中执行此操作的最简单方法是什么?(我想它需要一些shell魔法或第三方组件)

谢谢!

delphi shell file-io winapi delphi-7

7
推荐指数
3
解决办法
8027
查看次数

从Internet下载文件,同时可以随时中止下载

我想从专门用于下载的单独线程中下载Delphi程序中的文件.

问题是主程序可以随时关闭(因此下载线程也可以随时终止).因此,即使没有连接或服务器滞后宝贵的秒钟,我需要一种方法在一两秒内终止下载线程.

你们建议使用什么功能?

我已经尝试过InterOpenURL/InternetReadFile但它没有超时参数.它有一个异步版本,但我找不到任何有用的Delphi示例,我不确定异步版本是否会保护我免受挂起...

以前建议使用套接字,但TClientSocket似乎也没有超时功能.

我需要做好充分准备,如果用户在他/她的计算机上遇到Internet连接问题或者网络服务器一直滞后我的应用程序在关闭之前就不会挂起.

在回答我不想使用任何第三方组件和Indy时请记住.非常感谢任何示例代码.

谢谢!

delphi multithreading wininet download delphi-7

7
推荐指数
2
解决办法
2595
查看次数

我在这里创建了内存泄漏吗?

一个非常简单的问题:

type

TMyRecord = Record
  Int: Integer;
  Str: String;
end;

PMyRecord = ^TMyRecord;

var
  Data: PMyRecord;
begin
  New(Data);
  Data.Int := 42;
  Data.Str := 'Test';
  Dispose(Data);
end;
Run Code Online (Sandbox Code Playgroud)

我的问题是,我在这里创建了一个内存泄漏(有String)吗?我打电话Data.Str := '';之前应该打电话Dispose

谢谢!

delphi memory-leaks memory-management delphi-7

7
推荐指数
2
解决办法
1445
查看次数

Windows中是否有共享文件夹,非提升用户具有写访问权限?

我知道commonappdata(所有用户)可以保存系统范围的应用程序设置,但在Vista/7下,非提升用户无法写入该目录.

是否存在用户共享的文件夹,任何非管理员用户都可以写入该文件夹?

这就是我需要这个的原因:我的应用程序由具有提升权限的Inno安装程序安装程序安装在PF目录中.然后,当实际的非管理员用户运行程序时,它会使用另一个非提升的Inno安装程序安装程序将其设置复制到用户的AppData目录.卸载程序后(由具有管理员权限的系统范围的安装程序启动)我想从每个用户的AppData目录中卸载程序的文件.

我可以想到两个解决方案:1.获取Windows用户列表并迭代他们的AppData目录(似乎太复杂了)2.在上述公共用户数据目录中存储卸载程序的路径.

有任何想法吗?

谢谢!

windows installer uac inno-setup appdata

7
推荐指数
1
解决办法
3847
查看次数

Firebird如何选择匹配集合中所有项目的ID

我正在使用Firebird 2.1.

这里有张桌子: IDs, Labels

同一ID可以有多个标签:

10 Peach
10 Pear
10 Apple
11 Apple
12 Pear
13 Peach
13 Apple
Run Code Online (Sandbox Code Playgroud)

假设我有一组标签,即:( Apple,Pear,Peach).

如何编写单个选择以返回在给定集合中包含所有标签的所有ID?我最好在用逗号分隔的字符串中指定集合,例如:('Apple','Pear','Peach') - >这应该返回ID = 10.

谢谢!

sql firebird firebird2.1

6
推荐指数
1
解决办法
584
查看次数