如何在 Visual Works 中获取 CPointer 的值

How to get the value of a CPointer in Visual Works

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

<C:int ssh_pki_import_pubkey_file (const char * filename,  VOID * pkey)>

现在第二个函数定义为:

int ssh_userauth_try_publickey (ssh_session session, const char * username, const ssh_key pubkey)

在 Smalltalk 中:

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

如果我使用第一个函数 (ssh_pki_import_pubkey_file) 的填充参数(没有转换)调用第二个函数 (ssh_userauth_try_publickey),它会失败。

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

GemStone/S中这是用#'&ptr'#'ptr'完成的,所以#'&ptr'会得到指针的值(CPointer 的值将在 return 上传递和更新)。

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

简答

在第一个函数中使用 void**,在第二个函数中使用 void*

长答案

在 C 语言中,void 表示“无”,如果您有 return 类型的 void,则表示您没有 return 任何内容。 但是 void* 意味着指向任何东西的指针(......我知道)......基本上你会得到一个指向你不知道它是什么的东西的指针。但它仍然是一个指针,不是什么都没有。

如果您有一个函数不是通过 return 而是通过参数产生值,您需要传递一个指针,以便该函数可以设置它的值。您可以通过 void* 做到这一点,但这是无意的。考虑以下 错误的 C 代码:

void var;
myFunc(&var);

myFunc 会采用 void* 作为参数来填充其值,但是 void 类型的变量是错误的,因为它的值是多少。在正确的 C 中,你会这样做:

void* var = NULL;
myFunc(&var);

这里var的类型明显是一个指针,它的值甚至被初始化了。对于 myFunc 这里没有真正的区别,除了它现在有一个 void** 作为参数。

因此,如果您将 ssh_pki_import_pubkey_file 的声明修改为具有 void** 参数并将 ssh_userauth_try_publickey 的声明更改为接受 void* 参数,您应该没问题。