C isfproxies_cpp.dll 0xC0000005: Место записи о нарушении доступа

#c

Вопрос:

Когда я вызвал метод во внешней библиотеке DLL, он получил ошибку «Нарушение доступа».

введите описание изображения здесь

Разборка в этом положении. Что случилось? введите описание изображения здесь

Если я установлю переменную домена как»», это будет следующим.
Добавление исключений в строку — Параметры DSSETSERVER(домен, пользователь, пароль, сервер);
Мой код:

 // ds_api.cpp : Defines the entry point for the application.
//
using namespace std;

#include "ds_api.h"
extern "C"
{
#include "dsapi.h"
}

int main()
{
    char* domain = "xxx";
    char* server = "xxx";
    char* user = "xxx";
    char* password = "xxx";

    printf(">>> in testconnection()n");
    DSSetServerParams(domain, user, password, server);
    printf(">>> result of set server params... %dn", DSGetLastError());
    char* result = DSGetProjectList();
    if (result != NULL)
    {
        printf(">>> getProjectList result = %sn", result);
    }
    else
    {
        printf(">>> last error = %dn", DSGetLastError());
    }
    return 0;
}
 

Комментарии:

1. Покажите нам код для DSSetServerParams . Если у вас нет кода, покажите нам его документацию.

2. @NateEldridge Спасибо за ответ! Это URL — адрес документации по методу- ibm.com/docs/en/iis/11.7?topic=kit-dssetserverparams

3. char* domain = "xxx"; — Это больше не является допустимым C . Строковые литералы таковы const char * . При DSSetServerParams попытке записи в эти строковые литералы код имеет неопределенное поведение. Предоставьте истинные, доступные для записи массивы символов, т. е. char domain[] = "xxx";

4. Дело в том, что char * тип параметра подразумевает, что данные, которые вы ему передаете, могут быть перезаписаны-у вас нет исходного кода DSSetServerParams , чтобы знать, записываются ли они char * . Вот почему вы должны передать массив символов, доступный для записи, независимо от того, перезаписаны данные или нет. Кроме того, если вы обнаружите, что DSSetServerParams данные записываются в эти массивы , вы не можете винить IBM-они просто скажут вам: «прочитайте документацию-мы сказали, что тип был char* , а не const char * »

5. char[] domain = "xxx"; char[] server = "xxx"; char[] user = "xxx"; char[] password = "xxx"; — Я не знаю, решит ли это проблему, но, по крайней мере, аргументы, которые вы будете передавать, будут правильного типа.