#c# #c #dll #glut #glutcreatewindow
#c# #c #dll #перенасыщение #glutcreatewindow
Вопрос:
Как отобразить окно переполнения внутри формы Windows?
glutCreateWindow(«Пример») создает другую форму,
glutCreateSubWindow(hwnd, 0, 0, 100, 100), где hwnd является дескриптором формы моего главного окна в C #, я получаю исключение AccessViolation.
Программа Glut находится в C DLL. Мое приложение находится на C # WPF. Мне нужно отобразить представление о перенасыщении в моей форме C #
Код на C :
extern "C"
{
__declspec(dllexport) int InitGlut(int hwnd, int top, int left, int width, int height)
{
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(top,left);
glutInitWindowSize(320,320);
//glutCreateWindow("Example");
glutCreateSubWindow(hwnd, top, left, width, height);
glutDisplayFunc(renderScene);
glutMainLoop();
return 0;
}
}
C # код:
const string pathToDll = "../../../Release/MyDLL.dll";
[DllImport(pathToDll)]
public static extern int InitGlut(IntPtr hwnd, int top, int left, int width, int height);
private void Window_Loaded(object sender, RoutedEventArgs e)
{
IntPtr hwnd = new WindowInteropHelper(Application.Current.MainWindow).Handle;
InitGlut(hwnd, 0, 0, 100, 100);
}
Комментарии:
1. Я не настолько уверен, чтобы публиковать в качестве ответа, но пара идей … 1./ Попробуйте добавить ‘unsafe’ к Window_Loaded и InitGlut в вашем коде C #. 2. / Убедитесь, что вы используете 64-разрядные версии всех 3 элементов (библиотеки GLUT, вашего кода на C и вашего кода на C #).
2. У вас есть несоответствие подписи в вашем коде, которое приведет к сбоям в 64-разрядных операционных системах. Сторона C ожидает, что hwnd будет
int
(что также неверно — они имеют размер указателя), и C # передает его какIntPtr
(правильно, но не то, что ожидает C ).
Ответ №1:
Похоже, вы размещаете объект Win32 в форме WPF. Да, для этого требуются обходные пути.
Вы видели руководство по взаимодействию WPF и Win32 в MSDN?
http://msdn.microsoft.com/en-us/library/ms742522.aspx
Вам также нужно проверить класс HwndHost:
http://msdn.microsoft.com/en-us/library/system.windows.interop.hwndhost.aspx
Комментарии:
1. Это не совсем объект Win32. Например, я создаю простое приложение для перенасыщения из этого руководства ( lighthouse3d.com/tutorials/glut-tutorial/initialization ). Это консольное приложение Win32, которое создает окно переполнения с помощью функции glutCreateWindow. Я меняю его на dll и вызываю его функции из моего WPF.
2. WPF, вероятно, считает GLUT объектом Win32, поскольку это не WPF.