2013-05-13 53 views
0

我试图在VisualWorks中调用EnumServicesStatus。对于第一次调用,我将参数设置为所需值,以知道返回的信息需要多少个字节(pcbBytesNeeded)。来自Smalltalk的C调用

现在我需要使用malloc:来分配内存给lpServices缓冲区,它需要实例的数量作为参数。我怎样才能轻松计算出来?只要将pcbBytesNeeded除以LPENUM_SERVICE_STATUS结构的大小,就会让我的代码在释放内存时崩溃。

/编辑

我解决了释放内存时的崩溃问题。 (我不小心操纵了持有指针的变量)。但是,我在对卡斯滕的评论中提出的问题仍然有效。为什么ENUM_SERVICE_STATUS的大小不会分开pcbBytesNeeded?这是因为LPTSTR lpServiceName和LPTSTR lpDisplayName成员?

回答

1

可以发送#sizeOf到ENUM_SERVICE_STATUS结构,类似于C.

所述的sizeof(ENUM_SERVICE_STATUS)

是这样的: numItems的:= pcbBytesNeeded /自ENUM_SERVICE_STATUS整型尺寸。

也请确保您调用EnumServicesStatusW函数,因为EnumServicesStatus是一个实际指向EnumServicesStatusW的宏。

+0

这就是我现在正在做的事情,并使它在释放时崩溃。 numItems:= 22728/36。这相当于631.333333333,这让我觉得这是错误的:) – Cantillon 2013-05-14 07:53:38

+0

该文档说服务的数量是作为参数传递的指针返回。 pcbBytesNeeded然后保存其余元素所需的内存量,因为缓冲区太小。由于函数计算内存的数量并且还回答了元素的数量,所以很可能根据所需的内存大小计算元素的数量是不可能的。 – Karsten 2015-01-11 08:33:32