32位dll在64位操作系统中不工作

32位dll在64位操作系统中不工作,dll,windows-7,contextmenu,32bit-64bit,Dll,Windows 7,Contextmenu,32bit 64bit,我创建了一个32位的dll文件(使用VisualStudio2008构建的项目:win32 app、ATL和COM对象)。在Win7 32位操作系统中,注册dll后,我在上下文菜单中获得“ABC”选项(右键单击)。现在我要赢得7个64位操作系统。Dll已成功加载,但右键单击(上下文菜单中)时没有“ABC”选项。有人能告诉我哪里出了错或者有什么建议吗 注意:右键单击文件夹可提供“ABC”选项。为32位编译的shell扩展将仅在32位进程中运行。64位Windows的Windows资源管理器是64位

我创建了一个32位的dll文件(使用VisualStudio2008构建的项目:win32 app、ATL和COM对象)。在Win7 32位操作系统中,注册dll后,我在上下文菜单中获得“ABC”选项(右键单击)。现在我要赢得7个64位操作系统。Dll已成功加载,但右键单击(上下文菜单中)时没有“ABC”选项。有人能告诉我哪里出了错或者有什么建议吗


注意:右键单击文件夹可提供“ABC”选项。

为32位编译的shell扩展将仅在32位进程中运行。64位Windows的Windows资源管理器是64位进程,因此需要64位外壳扩展

如果32位应用程序使用fileopen对话框(在64位Windows上),则该对话框需要32位shell扩展。因此,建议您按照以下方式安装扩展:

  • Win32:32位外壳扩展
  • Win64:64位和32位外壳扩展
为此,您必须为32位/64位shell扩展提供不同的guid。希望这能让事情变得更清楚一点


编辑:正如Raymond所建议的,两个扩展似乎可以使用相同的GUID。

为32位编译的shell扩展将仅在32位进程中运行。64位Windows的Windows资源管理器是64位进程,因此需要64位外壳扩展

如果32位应用程序使用fileopen对话框(在64位Windows上),则该对话框需要32位shell扩展。因此,建议您按照以下方式安装扩展:

  • Win32:32位外壳扩展
  • Win64:64位和32位外壳扩展
为此,您必须为32位/64位shell扩展提供不同的guid。希望这能让事情变得更清楚一点


编辑:正如Raymond所建议的,似乎两个扩展都可以使用相同的GUID。

如果在添加该选项的调用中代码中出现错误,请使用“检查最后一个错误”并显示一个消息框?是否为shell扩展(是否在资源管理器中显示上下文菜单)?你把它编译成64位了吗?32位外壳扩展在Win64上不运行。是的,我正在使用外壳扩展!是的,当我“为64位编译”时,它可以工作。但编译为32位时不工作@martinstoeckli你能解释一下为什么32位DLL在64位操作系统中不能工作。如果在添加该选项的调用中代码中出现错误,请使用check last error并显示一个消息框?它是外壳扩展(浏览器中是否显示上下文菜单)?你把它编译成64位了吗?32位外壳扩展在Win64上不运行。是的,我正在使用外壳扩展!是的,当我“为64位编译”时,它可以工作。但编译为32位时不工作@martinstoeckli你能解释为什么32位DLL在64位操作系统中不起作用。实际上你可以用相同的GUID注册它们,因为有单独的32位和64位注册表。32位应用程序将看到32位注册,64位应用程序将看到64位注册。这使得LNK在32位和64位应用程序之间的可移植性成为可能。@Raymond Chen-不知道这一点,我认为您需要不同的GUID。感谢您的提示。关键是使用两个不同版本的Regsvr32.exe。使用c:\windows\syswow64\regsvr32.exe注册32位版本。@Hans Passant我试过,但看不到上下文菜单。我认为“martinstoeckli”所说的是正确的。非常感谢您的建议和解决方案。实际上,您可以使用相同的GUID注册它们,因为有单独的32位和64位注册表。32位应用程序将看到32位注册,64位应用程序将看到64位注册。这使得LNK在32位和64位应用程序之间的可移植性成为可能。@Raymond Chen-不知道这一点,我认为您需要不同的GUID。感谢您的提示。关键是使用两个不同版本的Regsvr32.exe。使用c:\windows\syswow64\regsvr32.exe注册32位版本。@Hans Passant我试过,但看不到上下文菜单。我认为“martinstoeckli”所说的是正确的。非常感谢你们的建议和解决方案。