gpt4 book ai didi

c - 从将用于创建 DLL 的函数返回字符串

转载 作者:行者123 更新时间:2023-11-30 18:35:41 26 4
gpt4 key购买 nike

我需要创建一个 DLL 文件,该文件可用于 MS Access 和其他应用程序,这些应用程序在输入参数时将返回字符串。我对 MS Access 相当熟悉,但在 C 方面绝对是新手。

以下是我正在试验的代码。我希望能够发出像 getstring(32.1, 123.2, "here", 25) 这样的调用,并让它返回长度最多为 60 个字符的字符串。实际代码工作正常,并且 buf 包含我想要的字符串,当它完成运行时,但我在将它返回给调用函数时遇到问题。

更新:好的,我已经弄清楚如何创建 DLL 并从 VBA 运行函数,但我仍然在努力理解如何返回字符串。我想如果我能让这个发挥作用,我就可以完成我的整个项目。通过运行以下代码,我可以让 VBA 返回输入数字的平方,例如给它一个参数 10,我得到的答案是 100

double _stdcall square(double *x)
{
return *x * *x;
}

但是,当我在 Excel 中运行以下代码并向其提供“test”参数时,我得到的只是一个方框字符。

char _stdcall Boxx(char *x)
{
return *x;
}

在这种情况下,我希望它返回的是我输入的内容。如果我能让它返回,我希望能够用实际结果替换它。有什么建议吗?

char * Getstring(double lat, double lon, char *name, double zoom)
{
char buf[60] = { '\0' }; // Set the max length of the final link string
int ret = GenShortDroidMapUrl(lat, lon, zoom, name, buf, sizeof(buf) - 1);
return buf;
}

最佳答案

在发布的代码中,buf[]是一个自动变量,其生命周期在 Getstring() 之后结束函数已返回。自 buf[]当程序的控制权返回给调用者时将不再存在,指向此变量的指针将在 Getstring() 之后无效。已经回来了。

一种解决方案是将附加参数传递到 Getstring()函数接受字符串以及大小参数。自 buf将衰减为函数调用中的指针, sizeof运算符不能用于 Getstring()找到数组的大小,但是 buf_sz保持这个值:

char * Getstring(char *buf, size_t buf_sz, double lat, double lon, char *name, double zoom)
{
// buf[] has been zero-initialized in the caller
int ret = GenShortDroidMapUrl(lat, lon, zoom, name, buf, buf_sz - 1);

return buf;
}

另一个不需要更改函数签名的选项是为返回的字符串动态分配存储空间。再次,buf是指向 char 的指针在Getstring() ,所以sizeof表达式 GenShortDroidMapUrl()需要更换;这次常数BUF_SZ已经在这里使用了。请注意 malloc ed 内存需要为 free稍后由调用者调用。

#include <string.h>
#define BUF_SZ 60

/* ... */

char * Getstring(double lat, double lon, char *name, double zoom)
{
char *buf = malloc(sizeof *buf * BUF_SZ);
memset(buf, '\0', BUF_SZ);

/* Or use calloc() and avoid the call to memset() */
// char *buf = calloc(BUF_SZ, sizeof *buf);

int ret = GenShortDroidMapUrl(lat, lon, zoom, name, buf, BUF_SZ - 1);

return buf;
}

如果Getstring()是库的一部分,您需要确保释放函数与分配函数匹配。即malloc()版本可能有问题或calloc()Getstring()链接的版本与 free() 的版本不同调用代码所链接的。一种解决方案是为库提供释放函数。这可以像包装 free() 一样简单在调用者使用的另一个函数中,以确保使用匹配的释放器。这里,函数DLL_Free()是 DLL 的一部分,并且 malloc() , calloc() ,和free()创建 DLL 时,所有这些都将链接到同一个库。使用Getstring()的调用者将使用 DLL_Free()解除分配。来自调用者,free()可能无法按预期释放 Getstring() 分配的内存,但是DLL_Free()会因为这个解除分配器使用 free() 的版本与 DLL 中使用的分配器相匹配。

/* Deallocation function included in DLL that matches allocation
* functions used in library
*/
void DLL_Free(void *ptr)
{
free(ptr);
}

关于c - 从将用于创建 DLL 的函数返回字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45997813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com