#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";
— Я не знаю, решит ли это проблему, но, по крайней мере, аргументы, которые вы будете передавать, будут правильного типа.