C#

2011-11-09 9 views
5

'dan IDispatch COM arabiriminin bir üyesini çağırma IDIpatch arabirimini C# içinde uygulayan bir COM nesnesinden GetIdsOfNames işlevini çağırmak istedim. Aşağıdaki kodu yazdım ama DISP_E_UNKNOWNNAME ile başarısız. Bunu yapmak için doğru yaklaşım bu mu?C#

Object so = Activator.CreateInstance(Type.GetTypeFromProgID("ProgID"));    
Object[] args = new Object[5]; 
string[] rgsNames = new string[1]; 
rgsNames[0] = "PrintNormal"; 
uint LOCALE_SYSTEM_DEFAULT = 0x0800; 
uint lcid = LOCALE_SYSTEM_DEFAULT; 
int cNames = 1; 
int[] rgDispId = new int[1]; 
args[0] = IntPtr.Zero; 
args[1] = rgsNames; 
args[2] = cNames; 
args[3] = lcid; 
args[4] = rgDispId;    
Object result = so.GetType().InvokeMember("GetIDsOfNames", BindingFlags.InvokeMethod, null, so, args); 

sayesinde

Richard

cevap

4

ınvokemember dahili GetIDsOfNames kullanır yapamazsın Hayır, çünkü ve bu bir tek gerçek yöntemler değil IDispatch ilk 6 denetler. Başka bir deyişle, GetIDsOfNames, IDispatch yöntemi Invoke kullanılarak çağrılmaz. COM böyle çalışır.

21

Evet, çalışmıyor, RCW IDispatch yöntemlerini göstermiyor. IDispatch arabirim başvurusunu açıkça almanız gerekir. Bu iyi çalıştı:

using System; 
using System.Runtime.InteropServices; 
using System.Runtime.InteropServices.ComTypes; 

class Program { 
    static void Main() { 
     Object so = Activator.CreateInstance(Type.GetTypeFromProgID("SAPI.SpVoice")); 
     string[] rgsNames = new string[1]; 
     int[] rgDispId = new int[1]; 
     rgsNames[0] = "Speak"; 
     IDispatch disp = (IDispatch)so; 
     Guid dummy = Guid.Empty; 
     disp.GetIDsOfNames(ref dummy, rgsNames, 1, 0x800, rgDispId); 
     Console.WriteLine(rgDispId[0]); 
    } 

    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00020400-0000-0000-C000-000000000046")] 
    private interface IDispatch { 
     int GetTypeInfoCount(); 
     [return: MarshalAs(UnmanagedType.Interface)] 
     ITypeInfo GetTypeInfo([In, MarshalAs(UnmanagedType.U4)] int iTInfo, [In, MarshalAs(UnmanagedType.U4)] int lcid); 
     void GetIDsOfNames([In] ref Guid riid, [In, MarshalAs(UnmanagedType.LPArray)] string[] rgszNames, [In, MarshalAs(UnmanagedType.U4)] int cNames, [In, MarshalAs(UnmanagedType.U4)] int lcid, [Out, MarshalAs(UnmanagedType.LPArray)] int[] rgDispId); 
    } 
} 
+0

Teşekkürler. Thats gerçekten çok yararlı. –