2010-12-29 19 views
0

このコードを使用して、C#のネイティブWindowsエクスプローラメニューを反復処理します。x64プラットフォームのC#からネイティブAPIを呼び出す際の問題

これはGetMenuItemInfo機能の輸入です:

[DllImport("user32.dll",SetLastError = true)] 
public static extern bool GetMenuItemInfo(IntPtr hMenu, int uItem, 
            bool fByPosition, ref MENUITEMINFO lpmii); 

私はメニューを反復処理このコードで:

int count = User32.GetMenuItemCount(menu); 
var itemInfo = new MENUITEMINFO(); 

itemInfo.cbSize = Marshal.SizeOf(itemInfo); 
itemInfo.fMask = MIIM.MIIM_ID | MIIM.MIIM_STRING; 

bool previousDeleted = false; 

for (int n = 0; n < count; n++) 
{ 
    itemInfo.dwTypeData = new string(' ', 100); 
    itemInfo.cch = 100; 

    if(!User32.GetMenuItemInfo(menu, n, true, ref itemInfo)) 
    { 
     Debug.Print("Error={0}",Marshal.GetLastWin32Error()); 
    } 

... 

私は、x86アプリケーションからこのコードを呼び出すとき - それは、完璧に動作 しかし、ときに私このコードを「Any CPU」アプリケーションから呼び出すと、動作していません。エラーコード87(ERROR_INVALID_PARAMETER)が返されます。

アイデア?

ありがとうございました。

+0

GetMenuItemCount呼び出しは成功していますか?カウントが-1かどうかを確認する必要があります。 –

+0

また、2行目に作成しているMENUITEMINFOタイプは何ですか?それはあなた自身のタイプですか、フレームワークによって提供されていますか?私は名前空間プレフィックスを持たないので、それはあなた自身のものだと仮定していますが、おそらくあなたは私たちが見ることができない "using"ステートメントを持っていますか? –

答えて

2

間違った定義MENUITEMINFOを使用する必要があります。正しいC#シグニチャについては、PInvoke MENUITEMINFOを参照してください。代わりに代わりに使用しているもの(例:hSubMenu)を表示するには、ページをさらに見てください。

+0

素晴らしい!できます! :-) – xVir

0

私はx86とx64プラットフォーム用の2つの別個のプロジェクトラッパーを持つソリューションを見てきました。実行時に適切な実装を解決するためのインタフェースとファクトリを持つ追加のプロジェクトがありました。

関連する問題