【问题标题】:DLL call to a method involving strncpy()DLL 调用涉及 strncpy() 的方法
【发布时间】: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。但仍然遇到同样的问题。

标签: c++ dll strncpy silktest


【解决方案1】:

您确定 finalName.fullName.name1 和 finalName.fullName.name2 正在设置吗?请确保。 要为空终止,您可以执行 first[strlen(finalName.fullName.name1)] = '\0';

【讨论】:

  • 同意。空终止在这里不是问题。也许,名称正在设置,然后在内部被重置。我将对此进行调试。谢谢!
  • 如果您发现这有助于解决您的问题,您可以将其标记为正确 :)
【解决方案2】:
int __stdcall get_name(char* first, char* last) {

ansicall int get_name(out string name); //dll method declaration

所以第一个有两个参数,第二个有一个。他们显然不匹配。您希望如何在这里获得有用的东西?

此外,您的测试似乎没有调用set_name,因此finalName 将只保存空指针。

【讨论】:

  • 编辑了问题。请看一看。
  • @Corleone :我认为最后一句话才是真正的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 2023-03-14
  • 2015-03-03
  • 2011-02-18
  • 2013-09-30
相关资源
最近更新 更多