KirillHelm
@KirillHelm

Как интегрировать класс на чистом C++ в форму на C++/CLI?

Уже задавал вопрос по этой теме но так и не получил ответа. Сейчас уточнил немного с чем именно я связался но вот ничего в интернете по данному вопросу так и не нашёл за эти сутки.

Исходные давнные:
  • Статическая либа на чистом C++
  • Проект с формой на C++/CLI

Вопрос:
Как объявить полем класс из библиотеки в классе формы и проинициализировать его правильно?
Как я это делаю:
public:
Form()
{
example = new myClass();
}
private:
myClass * example;

Предупреждая все вопросы:
  1. В списке инициализации пробовал, не помогает.
  2. Если попробовать обратится к методам класса в методах формы, тот же ексепшн.
  3. Через "указатель" для C++/CLI — ^ тоже пробовал, вместе с "gcnew", всё тот же результат, менять класс свой в библиотеке под стилистику C++/CLI не буду, класс должен оставаться на чистом C++.

Эксепшн в Runtime:
Exception thrown at 0x77D513B9 (ntdll.dll) in App.exe: 0xC0000005: Access violation reading location 0x29AD7B2C.
  • Вопрос задан
  • 900 просмотров
Пригласить эксперта
Ответы на вопрос 1
@EkvVN
Тоже когда-то сталкивался с необходимостью использовать статическую либу в managed c++
осталась заметка, возможно поможет:

Я разобрался с этой ошибкой и нашел решение, которое вроде работает

У меня в коде в отдельной статически линкуемой библиотеке (*.lib) есть статические поля класса
И при запуске программы они инициализируются, как и все остальные статические и глобальные переменные
И вот при их инициализации в рантайме прога падает на ассерте в одном из стандартных файлов
/*
* If this ASSERT fails, a baf pointer has been passed in. It may be
* totally bogus, or it may have been allocated from another heap.
* The pointer MUST come from the 'local' heap.
*/
_ASSERTE(_CrtIsValidHeapPointer(pUserData))

В интернете нашкл, что для исполняего CLR проекта нужно изменить в свойствах Линкера точку входа
Linker->Advanced
Entry Point: main

1) для x32, заменить на:
?mainCRTStartupStrArray@@$$FYMHP$01AP$AAVString@System@@@Z

2) для x64, заменить на:
?mainCRTStartupStrArray@@$$FYMHP$01EAPE$AAVString@System@@@Z

Т.к. она имеет не стандартный вид:
int main(int argc, int** argv)

А такой:
int main(array ^args)

----
https://stackoverflow.com/questions/15188757/how-d...

А по вопросу:
создать через new и хранить указатель на класс, как в стандартном С++

C++:
class myClass
{
};


С++/CLI:
public ref class Form : System::Windpows::Forms
{
public:
    Form()
    {
        example = new myClass();
    }
    ~Form()
    {
        delete example;
    }
private:
    myClass * example;
};
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы