powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Падежи ФИО из DLL (Плахов, Покаташкин) в программе на VС++
10 сообщений из 10, страница 1 из 1
Падежи ФИО из DLL (Плахов, Покаташкин) в программе на VС++
    #33646090
Efim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я уже задавал этот вопрос, только для VB.NET ( Падежи ФИО из DLL (Плахов, Покаташкин) в программе на VB.NET ).
Там все получилось.

Мне понадобилось переделать для С++. На C++ практически не писал.

Может кто использовал DLL Плахова/Покаташкина для склонения ФИО ( ссылка здесь )?

Функция из DLL:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
using System::String;
typedef int (*MYPROC)( System::String^,Boolean ,System::Int32 ,System::String^ , System::Int32*);
private:int f2(System::String^  tfio, System::String^ res)
{int rr;
 System::Int32 nlen= 80 ;
 res="                                                                                          ";
 MYPROC ProcAdd;
 HINSTANCE hinstLib;
 Boolean fres=false;
 Boolean bsex=true;
 System::Int32 padeg= 2 ;

 hinstLib = LoadLibrary(TEXT("Padeg"));
 if (hinstLib != NULL)
  { ProcAdd = (MYPROC) GetProcAddress(hinstLib, "GetFIOPadegFS"); 
    // If the function address is valid, call the function.
    if (NULL != ProcAdd) 
     { rr=ProcAdd (tfio,bsex,padeg,res, (System::Int32*) nlen); //здесь ошибка
     }
     else return - 1 ;
  }
 else return - 1 ;
        // Free the DLL module.
 fres = FreeLibrary(hinstLib); 
 return  1 ;
}

Вызываю так:
Код: plaintext
1.
2.
3.
4.
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
 {int fr;
System::String^ frres="";
fr=f2( this->textBox1->Text,frres);
 }

На строке
Код: plaintext
rr=ProcAdd (tfio,bsex,padeg,res, (System::Int32*) nlen);
выскакивает ошибка
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Как исправить?
Спасибо.
...
Рейтинг: 0 / 0
Падежи ФИО из DLL (Плахов, Покаташкин) в программе на VС++
    #33646451
Maksim UM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если сходу, нужно выделять память под результат,
а не пустую строку передавать. После получения
результата обрезать до nlen.
И еще, нужно FreeLibrary делать и тут перед return -1
Код: plaintext
1.
2.
3.
4.
     if (NULL != ProcAdd) 
     { rr=ProcAdd (tfio,bsex,padeg,res, (System::Int32*) nlen); //здесь ошибка
     }
     else return - 1 ;
...
Рейтинг: 0 / 0
Падежи ФИО из DLL (Плахов, Покаташкин) в программе на VС++
    #33646919
Efim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maksim UM нужно выделять память под результат,
а не пустую строку передавать

Результат записывается в res .
Насколько я понимаю, когда я приравниваю к res строку с пробелами выделяется память.
...
Рейтинг: 0 / 0
Падежи ФИО из DLL (Плахов, Покаташкин) в программе на VС++
    #33646960
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Efim Maksim UM нужно выделять память под результат,
а не пустую строку передавать

Результат записывается в res .
Насколько я понимаю, когда я приравниваю к res строку с пробелами выделяется память.

Но это не означает, что в эту память всегда можно писать.
Компилятор вполне себе может поместить строку из пробелов в read only область и привет

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int main()
{
    char *s = "                       ";
    sprintf(s, "test");
    printf("s=%s", s);
    return  0 ;
}

$ ./a.out
Segmentation fault
...
Рейтинг: 0 / 0
Падежи ФИО из DLL (Плахов, Покаташкин) в программе на VС++
    #33647264
Maksim UM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Efim Maksim UM нужно выделять память под результат,
а не пустую строку передавать

Результат записывается в res .
Насколько я понимаю, когда я приравниваю к res строку с пробелами выделяется память.
Выделяется, 0 байт :)
Надо, что бы res было по размеру больше или равно
результирующей строки.
...
Рейтинг: 0 / 0
Падежи ФИО из DLL (Плахов, Покаташкин) в программе на VС++
    #33648061
Efim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если инициализировать res так?
Код: plaintext
1.
char *res=new char[ 50 ];
res= "                                                  ";// 50  пробелов
...
Рейтинг: 0 / 0
Падежи ФИО из DLL (Плахов, Покаташкин) в программе на VС++
    #33648067
Efim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
то появляется та же ошибка.
...
Рейтинг: 0 / 0
Падежи ФИО из DLL (Плахов, Покаташкин) в программе на VС++
    #33649405
Maksim UM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кстати, а обявление часом не такое должно быть?
typedef int (*MYPROC)( char *,Boolean ,System::Int32 ,char * , System::Int32*);
...
Рейтинг: 0 / 0
Падежи ФИО из DLL (Плахов, Покаташкин) в программе на VС++
    #33650248
Efim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Объявление сейчас такое:
Код: plaintext
typedef int (*MYPROC)( System::String^,Boolean ,System::Int32 ,char* , System::Int32*);

Насчет первого параметра - не получается преобразовать String^ в char* .
...
Рейтинг: 0 / 0
Падежи ФИО из DLL (Плахов, Покаташкин) в программе на VС++
    #33679415
dilomakin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только сегодня я заборол одну из финкций этой dll'ки, может, будет полезна:
В хедере объявляю тип:
Код: plaintext
typedef int (__stdcall *GetFIOPadegAS)(char[], char[], char[], int, char[], int&);
И затем вот так вызываю функцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
HINSTANCE hDll = LoadLibrary("Padeg.dll");
if (hDll) {
	GetFIOPadegAS pGetFIOPadegAS;
	pGetFIOPadegAS = (GetFIOPadegAS) GetProcAddress(hDll, "GetFIOPadegAS");
	char lname[ 50 ];
	char fname[ 50 ];
	char mname[ 50 ];
	char cased[ 255 ];
	GetDlgItemText(IDC_EDIT_LNAME, lname, sizeof(lname));
	GetDlgItemText(IDC_EDIT_FNAME, fname, sizeof(fname));
	GetDlgItemText(IDC_EDIT_MNAME, mname, sizeof(mname));
	int bLen = sizeof(cased);
	int res = pGetFIOPadegAS(lname, fname, mname, iPadeg, cased, bLen);
	FreeLibrary(hDll);
	SetDlgItemText(IDC_EDIT_RESULT, (LPCTSTR) cased);
} else {
	MessageBox("DLL не загружена", "Ошибка", MB_ICONERROR);
}
Идентификаторы IDC_* - это Edit Control'ы
iPadeg - переменная типа int
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Падежи ФИО из DLL (Плахов, Покаташкин) в программе на VС++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]