【发布时间】:2020-03-06 11:57:09
【问题描述】:
我有一个产生多个 CreateProcess 线程的应用程序,并且我成功地将 stdout 和 stderr 输出重定向到每个文本文件。
但是,我发现了 stdout/strderr 句柄由所有此类线程继承的特性,而不仅仅是我希望它们被继承的那些。所以我开始了在CreateProcess 函数来解决这个问题,但我被卡住了。
如果我在 UpdateProcThreadAttribute 过程中使用 PROC_THREAD_ATTRIBUTE_HANDLE_LIST 作为 Attribute 参数,它期望 lpValue 参数是指向列表的指针子进程要继承的句柄数。
对于我尝试使用的列表
TList<Cardinal>
还创建了一个 Cardinals 数组,但无法获得任何编译方法!
问题:如何创建和填充这样的列表?
其次,in this example 使用的是 kernel32.dll 中的函数和过程,但它们也存在于 Windows 单元中(我使用的是 Delphi 10.3),尽管定义不同:
例如,InitializeProcThreadAttributeList( nil, 1, 0, vAListSize ); 由于 nil 参数而无法使用 Windows 单元进行编译,因为 实际和正式 var 参数的类型必须相同 但我使用内核32
问题:我应该使用这些函数/程序的哪个版本?
谢谢。
【问题讨论】:
-
您需要将指针传递给句柄数组 (
HANDLE h[n]) -
当函数需要
THandle时,为什么你会想到使用Cardinal?如果您不能将nil传递给InitializeProcThreadAttributeList,那么我怀疑您应该自己声明InitializeProcThreadAttributeList,然后做对。这就是我所做的 FWIW -
好问题!我可能到达那里是因为定义上写着“pValue - System.Cardinal”,我一直在尝试各种方法来让它工作但无济于事!并且在其中 vMyHandles 是句柄数组的 UpdateProcThreadAttribute 中使用 @vMyHandles 无法编译。我对使用指针有点困惑
-
不要将 IDE 用作 Windows API 的参考。使用实际的 Windows API 参考。并且不要相信 Emba 标题翻译。他们经常是错的。
-
@vMyHandles是指向数组地址的指针。那是间接的一级太远了。不管怎样,我的回答中你有你需要的一切。
标签: delphi winapi vcl kernel32