C# нарушение доступа к памяти Windows 7

Я использую расширенный установщик 8.3 и пытаюсь внедрить пробную лицензию для своего приложения, целевой ОС является Windows 7 x32 и x64.

Следующий код взят из примера, предоставленного расширенным установщиком.

 [DllImport("Trial.dll", EntryPoint = "ReadSettingsStr", CharSet = CharSet.Auto)]
private static extern uint InitTrial(String aKeyCode, IntPtr aHWnd);

[DllImport("Trial.dll", EntryPoint = "ReadSettingsRetStr", CharSet = CharSet.Auto)]
private static extern uint InitTrialReturn(String aKeyCode, IntPtr aHWnd);

[DllImport("Trial.dll", EntryPoint = "DisplayRegistrationStr", CharSet = CharSet.Auto)]
private static extern uint DisplayRegistration(String aKeyCode);

[DllImport("Trial.dll", EntryPoint = "GetPropertyValue", CharSet = CharSet.Auto)]
private static extern uint GetPropertyValue(String aPropName, StringBuilder aResult, ref UInt32 aResultLen);

 private void registerToolStripMenuItem_Click(object sender, EventArgs e)
{
  try
  {
    Process process = Process.GetCurrentProcess();
    DisplayRegistration(kLibraryKey, process.MainWindowHandle);
  }

  catch(Exception ex1) 
  {
    MessageBox.Show(ex1.ToString());
  }
}

Подпись типа, установленная в расширенном установщике, представляет собой 32-битный юникод с поддержкой DEP.

Проблема в том, что каждый раз, когда я выбираю регистрацию, я получаю нарушение прав доступа. Похоже, я не могу использовать переключатель в своем приложении, чтобы отключить DEP, поскольку это требуется для моего приложения.

Есть ли у кого-нибудь идеи, как обойти это, поскольку я проверил на форуме расширенного установщика, и там не так много, кроме подобных проблем.

Огромное спасибо

ОК, быстрое обновление.

Я пробовал все комбинации типа sig, вот что я нашел.

Установите тип на 32-битный Ansi (поддерживает Win9x или выше) и установите CharSet на Ansi/Unicode или автоматический результат = CRASH.

Установка типа на 32-битный Unicode (с поддержкой DEP) и установка CharSet на Unicode или автоматический результат = нарушение прав доступа.

Установите тип на 32-битный Unicode (с поддержкой DEP) и установите для CharSet значение Ansi, результат = успех.

Поэтому, хотя он работает, в Advanced Installer явно есть ошибка.


person Kevin    schedule 05.09.2011    source источник
comment
Почему вы хотите включить DEP?   -  person David Heffernan    schedule 05.09.2011
comment
@David Heffernan: Очевидно, это требование расширенного установщика для x86. Двоичные файлы (ANSI) ... поддерживают ОС Win9x или выше и не могут использоваться в приложениях с поддержкой DEP.   -  person Christian.K    schedule 05.09.2011
comment
Я не совсем понимаю, но похоже, что они поддерживают два типа библиотек, совместимых с DEP.   -  person David Heffernan    schedule 05.09.2011
comment
Можете ли вы также вставить подписи типа C? С информацией, предоставленной до сих пор, и не видя сигнатур типа C, я бы попробовал разные значения перечисления CharSet.   -  person Mike    schedule 05.09.2011
comment
Теперь добавьте подпись типа C, я попробую разные значения CharSet, посмотрим, решит ли это проблему. Подпись, которую я использую, должна быть совместима с DEP.   -  person Kevin    schedule 05.09.2011
comment
ОК, это странно для всех импортов, я установил значение CharSet в CharSet.None, и это работает, без нарушения прав доступа. Правильно ли установлено значение «Нет»?   -  person Kevin    schedule 05.09.2011
comment
Вы пытались связаться со службой поддержки Advanced Installer?   -  person cosmin    schedule 05.09.2011
comment
Страница, на которую ссылается Кристиан, ясно показывает, что требуется CharSet.Ansi. Этого недостаточно для объяснения сбоя, CharSet.Auto заставит его увидеть строку длиной в один символ. Этот продукт явно не прошел простой тест на дым, вам следует подумать о том, чтобы отказаться от него.   -  person Hans Passant    schedule 05.09.2011
comment
Собственно, этого достаточно, чтобы объяснить крушение. Все руководства по лицензированию Advanced Installer и инструкции используют CharSet.Ansi, потому что это сигнатура функции. Любой другой CharSet не соответствует подписи.   -  person cosmin    schedule 06.09.2011


Ответы (1)


Основываясь на вашем последнем комментарии (использование CharSet.None решает проблему), я бы предполагаю следующее:

Указание CharSet.None, который является устаревшим синонимом для CharSet.Ansi, действительно приводит к тому, что P/Invoke упорядочивает строки как ANSI, а не Unicode (который будет использоваться с CharSet.Auto на платформах Windows NT).

Посмотрите "6. Интегрируйте библиотеку лицензирования в приложение". похоже, что VB.NET (так что, возможно, и C #) должен использовать «ANSI» версию Trial.dll (API).

Или, может быть, есть другая версия Trial.dll, которая поддерживает юникод, но не та, что указана в вашем PATH (и, следовательно, не найдена P/Invoke).

Продукт не знаю, поэтому сложно сказать.

person Christian.K    schedule 05.09.2011
comment
Доступна Unicode Trial.dll. Так что, возможно, функция лицензирования настроена неправильно. - person cosmin; 05.09.2011