私は、彼らがされるべきだと思うと、このタスクのために、私はその後、私は手動でインターフェイスを取得しようとした、最初から定義を建てて、pinvoke.netのようなサイトに記載されていないIOpenControlPanelインターフェイスを実装しようとしていますレジストリからのCLSIDはD11AD862-66DE-4DF4-BF6C-1F5621996AF1
と思われ、そのインフェフェースを実装するクラスは06622D85-6856-4460-8DE1-A81921B41C4B
と思われます。マネージコードからwin32 'IOpenControlPanel'インターフェイスを使用するには?
問題がthis MSDN articleで説明したように、次のコードで(私はMicrosoft.DefaultPrograms
のような適切な正規名を使用しています、私は期待値を得ることはありませんGetCurrentView
関数を呼び出すと、Open
関数の呼び出しは、何もしない場合ということですthis list of canonical namesから。)
Dim cp As New COpenControlPanel
Dim view As ControlPanelView
DirectCast(cp, IOpenControlPanel).GetCurrentView(view)
DirectCast(cp, IOpenControlPanel).Open("Microsoft.DefaultPrograms", "", Nothing)
だから、私は私の定義はいくつかの方法で間違っている、私はそれを修正するための助けが必要だと思います。
これらの定義は以下のとおりです。
VB.Net:
Friend NotInheritable Class NativeMethods
Enum ControlPanelView As Integer
Classic = 0
Category = 1
End Enum
<ComImport()>
<Guid("06622D85-6856-4460-8DE1-A81921B41C4B")>
Class COpenControlPanel
End Class
<ComImport()>
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
<Guid("D11AD862-66DE-4DF4-BF6C-1F5621996AF1")>
Interface IOpenControlPanel
<PreserveSig()>
Function GetCurrentView(ByRef refView As ControlPanelView
) As Integer
<PreserveSig()>
Function GetPath(<MarshalAs(UnmanagedType.LPWStr)> ByVal name As String,
<MarshalAs(UnmanagedType.LPWStr)> ByRef refPath As StringBuilder,
ByVal bufferSize As Integer
) As Integer
<PreserveSig()>
Function Open(<MarshalAs(UnmanagedType.LPWStr)> ByVal name As String,
<MarshalAs(UnmanagedType.LPWStr)> ByVal page As String,
ByVal punkSite As IntPtr
) As Integer
End Interface
End Class
C#(オンライン翻訳):あなたがいなかったので
internal sealed class NativeMethods {
public enum ControlPanelView : int {
Classic = 0,
Category = 1
}
[ComImport()]
[Guid("06622D85-6856-4460-8DE1-A81921B41C4B")]
class COpenControlPanel {}
[ComImport()]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[GuidAttribute("D11AD862-66DE-4DF4-BF6C-1F5621996AF1")]
public interface IOpenControlPanel {
[PreserveSig()]
int GetCurrentView(ref ControlPanelView refView);
[PreserveSig()]
int GetPath([MarshalAs(UnmanagedType.LPWStr)] string name,
[MarshalAs(UnmanagedType.LPWStr)] ref StringBuilder refPath,
int bufferSize);
[PreserveSig()]
int Open([MarshalAs(UnmanagedType.LPWStr)] string name,
[MarshalAs(UnmanagedType.LPWStr)] string page,
IntPtr punkSite);
}
}
あなたがインターフェイスを作成することはできません。インターフェイスを提供(実装)するオブジェクトを作成する必要があります。 – GSerg
@GSerg、私は参照するために、** IShellLink **インターフェイスを使って次の例を取り上げました。これはインターフェイスだけを定義し、私が適用しようとしているのと同じテクニックを使用して成功裏にインスタンシエートしました:http://www.pinvoke.net /default.aspx/Interfaces/IShellLinkW.html – ElektroStudios
'IShellLink'を実装し、独自の' CLSID_ShellLink'を持つクラスである[ShellLink'を定義しました](http://stackoverflow.com/q/18885865/11683)あなたはそのクラスをインスタンス化しました。こっちも一緒。 – GSerg