Я создал 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.
Вы уверены, что finalName.fullName.name1 и finalName.fullName.name2 установлены? Пожалуйста, убедитесь, что.
Для нулевого завершения вы можете сделать
first [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
будет содержать только нулевые указатели.