Как я могу изменить char * в DLL? - PullRequest
0 голосов
/ 03 мая 2020

Когда я передаю char * в качестве параметра в DLL, я могу получить новый char *, когда я «возвращаю» char * из DLL, но я не могу этого сделать, просто используя этот параметр char * и ничего не возвращать.

Эта функция DLL в порядке, кажется, я могу передать char * в DLL.

void getStr(char *str){
   print("%s\n", str);
}

Это тоже нормально. Кажется, я могу изменить указатель внутри DLL.

void setInt(int a, int b, int *sum){
   *sum = a + b;
}

Но нет никакой удачи, когда указатель указывает на массив символов.

void setStr(char* str) {
    char tmp[] = "From DLL";
    int len = strlen(tmp) + 1;
    str = (char*)malloc(len);
    memcpy(str, tmp, len);
}

Я пытаюсь вызвать эту функцию DLL из программы на c ++, подобной этой:

int main()
{
    char tmp[] = "Hello World!";
    setStr(tmp);  // I hope I can get "From DLL" here.
    std::cout << tmp;
}

Вывод все еще "Hello World!", ничего не произошло после того, как я попытался получить новый char *. Если я устанавливаю возвращаемое значение функции DLL на char * и получаю возвращаемое значение в программе на c ++, все в порядке, но я не могу просто использовать параметр для этого.

Я что-то пропустил?

1 Ответ

3 голосов
/ 03 мая 2020

Чтобы изменить данный строковый буфер, измените данный строковый буфер.

void setStr(char* str) {
    char tmp[] = "From DLL";
    int len = strlen(tmp) + 1;
    memcpy(str, tmp, len);
}

int main()
{
    char tmp[] = "Hello World!";
    setStr(tmp);  // I hope I can get "From DLL" here.
    std::cout << tmp;
}

Чтобы изменить указатель, передайте указатель на указатель.

void setStr(char** str) {
    char tmp[] = "From DLL";
    int len = strlen(tmp) + 1;
    *str = (char*)malloc(len);
    memcpy(*str, tmp, len);
}

int main()
{
    char tmp[] = "Hello World!";
    char* ptmp = tmp; // character array is NOT a pointer, so add a pointer to modify
    setStr(&ptmp);  // I hope I can get "From DLL" here.
    std::cout << ptmp;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...