C#内存访问违规Windows 7

时间:2011-09-05 11:08:15

标签: c# dllimport access-violation

我正在使用高级安装程序8.3并尝试为我的应用程序提供试用许可,目标操作系统是Windows 7 x32& 64。

以下代码取自高级安装程序提供的示例。

 [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或自动结果=访问冲突。

将类型设置为32位Unicode(DEP Aware)并将CharSet设置为Ansi result = success。

因此,虽然它正在运行,但显然是Advanced Installer中的一个错误。

1 个答案:

答案 0 :(得分:2)

根据您的上一条评论(使用CharSet.None解决问题),我会猜测以下内容:

指定CharSet.None,这是CharSet.Ansi不推荐使用的同义词,确实会导致P / Invoke到marshal the strings as ANSI,而不是Unicode(在Windows NT上将与CharSet.Auto一起使用平台)。

"6. Integrate the Licensing Library within application"它看起来像VB.NET(也许也是C#)应该使用Trial.dll(API)的“ANSI”版本。

或许有一个不同版本的Trial.dll支持unicode,但不是你的PATH中的那个(因此P / Invoke找不到它)。

我不知道该产品,所以很难说。