Вызов DLL для метода, включающего strncpy()

Я создал 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;
}

я звоню get_name через SilkTest, как показано ниже:

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)

Эта проблема:

Я получаю пустую / пустую строку в качестве вывода, а не "Альфред Аллен". В идеале, name должны быть заполнены содержанием Альфреда и lname с Алленом.

ПРИМЕЧАНИЕ: учтите, что set_name() вызывается изнутри, и имя уже установлено до вызова dll.

2 ответа

Решение

Вы уверены, что finalName.fullName.name1 и finalName.fullName.name2 установлены? Пожалуйста, убедитесь, что. Для завершения нуля вы можете сначала выполнить [strlen(finalName.fullName.name1)] = '\0';

int __stdcall get_name(char* first, char* last) {

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

Таким образом, у первого есть два параметра, у второго - один. Они явно не совпадают. Как вы ожидаете получить что-нибудь полезное здесь?

Кроме того, ваш тест не кажется, чтобы позвонить set_name, так finalName будет содержать только нулевые указатели.

Другие вопросы по тегам