Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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# 通过COM互操作和_RemoteHandle的公共项对话框-如何?_C#_Com_Com Interop_Fileopendialog - Fatal编程技术网

C# 通过COM互操作和_RemoteHandle的公共项对话框-如何?

C# 通过COM互操作和_RemoteHandle的公共项对话框-如何?,c#,com,com-interop,fileopendialog,C#,Com,Com Interop,Fileopendialog,我试图在我的C#应用程序中使用可定制的文件打开对话框,我发现Common Item Dialog为定制提供了简单的API。然而,它需要一些COM互操作的魔力,而且由于我对COM完全没有兴趣,我认为这将是一个很好的学习练习。现在我遇到了以下问题: 我创建了以下*.bat文件以生成互操作程序集: set OUT_DIR=.\com_interop if not exist %OUT_DIR% mkdir "%OUT_DIR% call "C:\Program Files (x86)\Micros

我试图在我的C#应用程序中使用可定制的文件打开对话框,我发现Common Item Dialog为定制提供了简单的API。然而,它需要一些COM互操作的魔力,而且由于我对COM完全没有兴趣,我认为这将是一个很好的学习练习。现在我遇到了以下问题:

我创建了以下*.bat文件以生成互操作程序集:

set OUT_DIR=.\com_interop

if not exist %OUT_DIR% mkdir "%OUT_DIR%

call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat"

set SDK_DIR="C:\Program Files\Microsoft SDKs\Windows\v7.1"
%SDK_DIR%\Bin\midl.exe /server none /client stub /out "%OUT_DIR%" /tlb ShObjIdl.tlb /x64  %SDK_DIR%\Include\ShObjIdl.idl

%SDK_DIR%\Bin\TlbImp.exe "%OUT_DIR%\ShObjIdl.tlb" /out:ComInterop.ShObj.dll /namespace:ComInterop.ShObj /machine:X64

move /Y ComInterop.ShObj.dll "%OUT_DIR%\ComInterop.ShObj.dll" 
所有与x64相关的交换机都来自我解决问题的尝试(失败),我不确定它们是否必要

现在,问题是:midl.exe生成符号,其中句柄转换为
\u RemotableHandle
类型。它不是
Show(IntPtr)
方法,而是生成
RemoteShow(\u RemotableHandle)

[Guid(“D57C7288-D4AD-4768-BE02-9D969532D960”)]
[接口类型(1)]
公共接口IFileOpendDialog:IFileDialog
{
无效添加位置(IShellItem psi、FDAP、FDAP);
无效通知(如有,则通知pfde、out uint pdwCookie);
作废ClearClientData();
无效关闭(整数小时);
无效GetCurrentSelection(输出IShellItem ppsi);
void GetFileName(输出字符串pszName);
作废GetFileTypeIndex(out uint piFileType);
作废GetFolder(出IShellItem ppsi);
无效选择(不含全氟辛烷磺酸);
void GetResult(输出IShellItem ppsi);
void GetResults(out-IShellItemArray-ppenum);
void GetSelectedItems(输出IShellItemArray ppsai);

void RemoteShow([ComAliasName(“ComInterop.ShObj.wireHWND”)]ref _remoteHandlehwnowner)//接受的答案是否能回答您的问题?如果不能,为什么不能?@Jeroen Mostert我以前见过这个线程(这就是我尝试转换的原因),但接受的答案对我并没有真正的帮助,因为:1.正如OP所提到的,在将
\u MIDL\u DECLARE\u WIREM\u HANDLE
标志传递给MIDL之后,我得到了关于未定义句柄类型的错误,但不幸的是,我不知道如何(以及在哪里)我相信这个标志是一个内部设置,添加缺少句柄类型的定义需要编辑SDK中包含的IDL文件,这对我来说似乎不是一个好(或正确)的解决方案。