【发布时间】:2017-11-07 09:10:24
【问题描述】:
我用以下方法创建了一个 DLL:
typedef struct names {
const char* name1;
const char* name2;
} rNames;
typedef struct useNames {
rNames fullName;
} rUseNames;
rUseNames finalName;
int set_name() {
finalName.fullName.name1 = "Alfred";
finalName.fullName.name2 = "Allen";
return 1;
}
int __stdcall get_name(char* first, char* last) {
strncpy((char*)first, finalName.fullName.name1,
strlen(finalName.fullName.name1));
strncpy((char*)last, finalName.fullName.name2,
strlen(finalName.fullName.name2));
return 1;
}
我正在通过 SilkTest 致电get_name,如下所示:
ansicall int get_name(out string fname, out string lname); //dll method
//declaration
STRING name = SPACE(256) //This initialises the name to 256 blank characters
STRING lname = SPACE(256)
get_name(name, lname)
print(name)
print(lname)
问题:
我得到一个 空白/空字符串 作为输出,而不是“Alfred Allen”。理想情况下,name 应该填充内容 Alfred,lname 填充 Allen。
注意:考虑到set_name() 正在内部调用,并且在调用 dll 之前已经设置了名称。
【问题讨论】:
-
您的
strncpy调用不会以空值终止输出,这可能是个问题 -
有没有办法动态终止'first'和'last'?
-
@Corleone:是的,您需要复制 strlen+1 来复制终止的 null。请注意,您正在滥用 strncpy - 像这样使用,它除了 memcpy 之外没有做任何事情。 (而且 strncpy 几乎从来都不是你想要的函数——它不一定是 null 终止,如果缓冲区太大,它将用 null 字符填充缓冲区。)
-
我确实使用了 strncpy 并将要复制的大小定义为 strlen+1。但仍然遇到同样的问题。