Сбой приложения .NET / VB6 в Windows 7 - PullRequest
1 голос
/ 19 ноября 2010

У меня есть приложение .NET 3.5 winforms, которое вызывает метод в VB6 ActiveX DLL, который вызывает диалоговое окно.Почти 10 лет все работало нормально (сначала как приложение .NET 1.1, затем 2.0, затем 3.5, все на Windows XP).Теперь, когда клиент обновился до Windows 7, я испытываю System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Структура вызова выглядит следующим образом:

.NET Code

try {
  VB6Object obj = new VB6Object();
  obj.DoStuff();
}
catch (Exception ex) {  // handle }

код VB6 в классе объекта VB6

Public Sub DoStuff()
    on error goto errHandle
    RetrieveData();

    Call frmPopup.Show(vbModal)

exitPoint:
    exit sub
errHandle: 
    ' handle error
End Sub

Проблема начинается с кода VB6 в этой строке: Call frmPopup.Show(vbModal).Ошибка распространяется на код .NET (обработчики ошибок в коде VB6 полностью игнорируются), где я обрабатываю ошибку.Я думал, что проблема может быть в событии Load frmPopup, но код никогда не достигает события Load (у меня везде есть инструкции трассировки, так что я так знаю).

Интересная частьчто во второй раз, когда я звоню, он вообще не выходит из строя, но в форме отсутствует сторонняя сетка (ActiveX DevExpress Quantum Grid), поэтому я предполагаю, что сетка, вероятно, как-то не совместима с Windows 7.

Все, что я описал, происходит, когда я просто запускаю приложение как EXE или из IDE VS2008, поэтому DLL-библиотека VB6 ActiveX является просто справочной.Если я использую COM-косвенность и запускаю код VB6 в IDE, все работает отлично.

Я пытался запустить программу от имени администратора, но ничего не изменилось.

Куда я могу обратиться, чтобы устранить эту проблему?

Ответы [ 2 ]

3 голосов
/ 20 ноября 2010

Выключить DEP. В старых элементах управления топором обычно используются фанки подклассов подклассов (кроме ATL / MFC), которые никому не нужны, чтобы отключить флаг NX.

2 голосов
/ 19 ноября 2010

Убедитесь, что вы компилируете для цели x86 вместо любого ЦПУ, особенно если вы работаете в 64-битных системах. Существует некоторый конфликт, когда вы используете anyCPU со старой 32-битной DLL в 64-битной системе Windows 7, и, цитируя старые руководства IBM, «результаты непредсказуемы».

...