c#内存访问冲突Windows 7

本文关键字:Windows 访问冲突 内存 | 更新日期: 2023-09-27 18:07:28

我正在使用高级安装程序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,因为它是我的应用程序所需要的。

有没有人有任何想法如何绕过这个,因为我已经检查了高级安装论坛和没有太多其他类似的问题。

多谢

OK快速更新

我尝试了所有签名类型的组合,这是我找到的。

将类型设置为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。

因此,尽管它工作正常,但在高级安装程序中明显存在一个错误。

c#内存访问冲突Windows 7

根据您最后的评论(使用CharSet.None修复问题),我将猜测如下:

指定CharSet.None,这是CharSet.Ansi的已弃用的同义词,实际上导致p/Invoke将字符串封送为ANSI,而不是Unicode(这将在Windows NT平台上与CharSet.Auto一起使用)。

看"6"。在应用程序中集成许可库,它看起来像VB。. NET(也可能是c#)应该使用Trial.dll (api)的"ANSI"版本。

或者可能有不同版本的Trial.dll支持unicode,但不是在您的PATH中(因此无法被p/Invoke找到)。

我不了解产品,所以很难说。