Вызов 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
будет содержать только нулевые указатели.