Smalltalk 如何在Visual Works中获得CPointer的价值

Smalltalk 如何在Visual Works中获得CPointer的价值,smalltalk,visualworks,Smalltalk,Visualworks,以下C函数在Visual Works中填充C结构(正常工作): 在Smalltalk中: <C:int ssh_userauth_try_publickey (VOID session, const char * username, const VOID pubkey)> 如果我调用第二个函数(ssh\u userauth\u try\u publickey),并使用第一个函数(ssh\u pki\u import\u publickey\u file)的填充参数(无转换),则

以下C函数在Visual Works中填充C结构(正常工作):

在Smalltalk中:

<C:int ssh_userauth_try_publickey (VOID session, const char * username, const VOID pubkey)>

如果我调用第二个函数(
ssh\u userauth\u try\u publickey
),并使用第一个函数(
ssh\u pki\u import\u publickey\u file
)的填充参数(无转换),则会失败

所以
VOID*pkey
必须匹配
const VOID pubkey

GemStone/S中,这是通过
#'&ptr'
#'ptr'
完成的,因此
#'&ptr'
将获得指针的值(返回时将传递并更新指针的值)

阅读《DLL&C Connect用户指南》尚未产生结果。

简短回答 在第一个函数中使用void**,在第二个函数中使用void*

长话短说 在C语言中,
void
表示“无”,如果返回类型为void,则表示不返回任何内容。 但是
void*
意味着指向任何东西的指针(…我所知道的)。。。基本上,你会得到一个指向某个你不知道它是什么的东西的指针。但它仍然是一个指针,不是什么

如果函数不是通过返回而是通过参数生成值,则需要传递指针,以便函数可以设置其值。你可以通过void做这件事,但那是无意的。考虑以下错误的C代码:

myFunc
会将void*作为参数来填充其值,但void类型的变量是错误的,因为它的值是什么。在正确的C中,您可以这样做:

void* var = NULL;
myFunc(&var);
这里的
var
类型显然是一个指针,它的值甚至被初始化。对于
myFunc
来说,这里没有真正的区别,只是它现在将有一个
void**
作为参数


因此,如果您修改
ssh\u pki\u import\u pubkey\u file
的声明,使其具有void**参数,并更改
ssh\u userauth\u try\u publickey
的声明,使其接受
void*
参数,您应该不会有问题。

在您建议的更改后,我得到了相同的结果。还需要更多的研究,但用void**替换void*似乎不会对最终结果产生任何变化。您似乎对
ssh\u userauth\u try\u publickey
函数中的
session
参数也有同样的问题。例如,您可以查看
Win32SystemSupport>>createPath:in:
。它调用
Win32SystemSupport>>RegCreateKey:named:reserved:class:options:sam:security:result:disposition:
其中
void*
是第一个参数(输入),而
void**
是第八个参数(输出)。这是一个很难解决的问题:)感谢您指出这个代码示例(Win32SystemSupport)。经过一些研究,问题是之前调用了C函数
ssh\u key\u new
,它回答了一个空的
ssh\u key
。但是#内容消息失败。似乎指向(ssh_key_new)的指针的内容不知怎么丢失了。将
ssh\u key\u new
替换为
External.CVoidType void pointer类型gcMalloc
后,现在一切正常。在最后一次调用C函数时,我简单地发送了内容,得到了正确的结果。尽管如此,我还是会对
ssh\u key\u new
中丢失的内容进行更多的研究,结果证明它比我预期的更简单
ssh\u key\u new
必须定义为:
,而不是
。现在有了新的定义#contents可以在
ssh_key_new
中正常工作。当您需要使用指针值/内容,然后在正确的位置使用**时,历史记录的摘要会出现!!
<C:int ssh_userauth_try_publickey (VOID session, const char * username, const VOID pubkey)>
void var;
myFunc(&var);
void* var = NULL;
myFunc(&var);