Нарушение доступа к памяти C # Windows 7 - PullRequest
0 голосов
/ 05 сентября 2011

Я использую расширенный установщик 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-битный Unicode DEP Aware.

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

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

Большое спасибо

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

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

Установка типа 32-битного Ansi (поддерживает Win9x или выше) и установите CharSet на Ansi / Unicode или Auto result = CRASH.

Установка типа 32-битного Unicode (DEP Aware) и установка CharSet на Unicode или Auto result = Access Violation.

Установка типа на 32-битный Unicode (DEP Aware) и установка CharSet на Ansi result = success.

Так что, хотя он работает, в Advanced Installer явно есть ошибка.

1 Ответ

2 голосов
/ 05 сентября 2011

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

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

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

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

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

...