Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 32位OpenFileDialog-->;64位系统32?_C#_.net_Winapi_Openfiledialog_Wow64 - Fatal编程技术网

C# 32位OpenFileDialog-->;64位系统32?

C# 32位OpenFileDialog-->;64位系统32?,c#,.net,winapi,openfiledialog,wow64,C#,.net,Winapi,Openfiledialog,Wow64,在32位程序中,如何使“打开/保存文件”对话框显示64位系统的System32文件夹中的文件 (Wow64DisableWow64FsRedirection不起作用,因为出于某种原因,它对对话框不起作用,我猜是因为它位于不同的线程上。当然,使用SysNative也不起作用,因为用户不知道内部发生了什么;他只想看到计算机上的“实际”文件。) 下面是另一种提问方式: 是否有任何32位程序从“打开文件”对话框浏览64位System32文件夹?我认为这根本不可能 即使您可以让对话框显示文件,当它们返回

在32位程序中,如何使“打开/保存文件”对话框显示64位系统的System32文件夹中的文件

Wow64DisableWow64FsRedirection
不起作用,因为出于某种原因,它对对话框不起作用,我猜是因为它位于不同的线程上。当然,使用
SysNative
也不起作用,因为用户不知道内部发生了什么;他只想看到计算机上的“实际”文件。)


下面是另一种提问方式:


是否有任何32位程序从“打开文件”对话框浏览64位
System32
文件夹?

我认为这根本不可能

即使您可以让对话框显示文件,当它们返回到32位进程时,它们的名称是什么?Sysnative有点像黑客,在任何情况下都不能在XP64上使用。这只是重载system32名称的结果

另一个思维实验。如果可能的话,您需要执行枚举的线程来禁用重定向。由于该线程不受您的控制,因此必须有一个已发布的选项来禁用它。没有。允许您从外部禁用重定向是不好的,因为当32位进程尝试加载外壳扩展时,这将导致DLL加载失败-如果您要加载DLL,则无法禁用重定向,因为您将获得错误的DLL


如果你想绕过这个限制,我想你应该写一个64位的程序。

我认为这是不可能的

即使您可以让对话框显示文件,当它们返回到32位进程时,它们的名称是什么?Sysnative有点像黑客,在任何情况下都不能在XP64上使用。这只是重载system32名称的结果

另一个思维实验。如果可能的话,您需要执行枚举的线程来禁用重定向。由于该线程不受您的控制,因此必须有一个已发布的选项来禁用它。没有。允许您从外部禁用重定向是不好的,因为当32位进程尝试加载外壳扩展时,这将导致DLL加载失败-如果您要加载DLL,则无法禁用重定向,因为您将获得错误的DLL


如果你想绕过这个限制,我想你应该写一个64位的程序。

我有一个可行的解决方案。这是一种黑客行为,但它是有效的

在我展示解决方案之前,请给出简短的免责声明。我基本上同意赫弗曼的观点。这不是命中注定的。实际上,我不建议对装运代码执行此操作。这是任何32位文本编辑器、文字处理器(包括32位Office)或普通应用程序都不支持的。64位系统上的普通用户不直接在系统目录中打开或保存文件。而且大多数非管理员用户无论如何都没有适当的权限来触摸其中的文件。Microsoft重定向文件系统,有很好的理由支持32位应用程序。不要试图反抗它

现在开始解决问题

诀窍是在DllMain中为每个DLL\u THREAD\u ATTACH回调调用Wow64DisableWow64FsRedirection

首先创建一个只包含DllMain的简单DLL,并导出两个函数:“StartDisableRedirect”和“DisableRedirection”

将二进制文件(EXE或DLL)直接链接到此DLL。然后在调用GetOpenFileName之前,调用StartDisableRedirect(这样后续线程就不会被重定向)和DisableRedirect(对于当前线程)

我特意创建了一个“Start”函数,以便在钩子实际开始处理线程之前加载所有DLL(包括系统DLL)。我不想假设实现Wow64Disable的DLL将在我的DLL之前加载。从DllMain调用代码时必须非常小心(请阅读:不应该)

extern int StartDisableRedirect();
extern int DisableRedirection();


void OnFile(HWND hwndParent)
{

    StartDisableRedirect();

    DisableRedirection();


    OPENFILENAME ofn = {};
    WCHAR szFile[MAX_PATH*2] = {};

    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hwndParent;
    ofn.lpstrFilter = L"All Files\0*.*\0\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFile = szFile;
    ofn.nMaxFile = ARRAYSIZE(szFile);
    ofn.Flags = OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;

    ::GetOpenFileName(&ofn);

}

我有一个有效的解决办法。这是一种黑客行为,但它是有效的

在我展示解决方案之前,请给出简短的免责声明。我基本上同意赫弗曼的观点。这不是命中注定的。实际上,我不建议对装运代码执行此操作。这是任何32位文本编辑器、文字处理器(包括32位Office)或普通应用程序都不支持的。64位系统上的普通用户不直接在系统目录中打开或保存文件。而且大多数非管理员用户无论如何都没有适当的权限来触摸其中的文件。Microsoft重定向文件系统,有很好的理由支持32位应用程序。不要试图反抗它

现在开始解决问题

诀窍是在DllMain中为每个DLL\u THREAD\u ATTACH回调调用Wow64DisableWow64FsRedirection

首先创建一个只包含DllMain的简单DLL,并导出两个函数:“StartDisableRedirect”和“DisableRedirection”

将二进制文件(EXE或DLL)直接链接到此DLL。然后在调用GetOpenFileName之前,调用StartDisableRedirect(这样后续线程就不会被重定向)和DisableRedirect(对于当前线程)

我特意创建了一个“Start”函数,以便在钩子实际开始处理线程之前加载所有DLL(包括系统DLL)。我不想假设实现Wow64Disable的DLL将在我的DLL之前加载。从DllMain调用代码时必须非常小心(请阅读:不应该)

extern int StartDisableRedirect();
extern int DisableRedirection();


void OnFile(HWND hwndParent)
{

    StartDisableRedirect();

    DisableRedirection();


    OPENFILENAME ofn = {};
    WCHAR szFile[MAX_PATH*2] = {};

    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hwndParent;
    ofn.lpstrFilter = L"All Files\0*.*\0\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFile = szFile;
    ofn.nMaxFile = ARRAYSIZE(szFile);
    ofn.Flags = OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;

    ::GetOpenFileName(&ofn);

}

这是安装程序的常见问题。人们希望为32位和64位系统提供一个可执行的安装程序,这意味着它必须是32位的。然而,32位安装程序无法将64位可执行文件放在正确的位置。解决方案是有一个单独的64位安装程序,由64位机器上的32位版本调用

您将创建一个64位程序,其任务是打开公共