2010-01-23 7 views
7

v'è una funzione nativa:Qual è la firma PInvoke corretta per una funzione che accetta var args?

int sqlite3_config(int, ...); 

Vorrei PInvoke a questa funzione. Attualmente, ho questa dichiarazione:

[DllImport("sqlite3", EntryPoint = "sqlite3_config")] 
public static extern Result Config (ConfigOption option); 

(Risultato e ConfigOption sono enumerazioni della forma enum Result : int { ... }.)

Sono effettivamente interessati solo nella versione singolo parametro di questa funzione e non hanno bisogno l'altra args. È corretto?

Sono anche curioso di sapere come dichiarare la forma a due argomenti (forse ci vorrebbero 2 IntPtrs?).

+0

Mi chiedo se il titolo ** Qual è la firma PInvoke corretta per una funzione variadica? ** sarebbe più Google friendly. – ChaosPandion

+1

Ho programmato C per tutta la mia carriera e ancora non riesco a ricordare la parola ** variadic ** :-) –

+1

Questi scienziati informatici e i loro nomi strani! Apparentemente, arity significa ** il numero di argomenti che una funzione può assumere **. – ChaosPandion

risposta

8

è necessario utilizzare la parola chiave __arglist (che è documentato), Bart # aveva un nice blog about it.

Esempio

class Program 
{ 
    [DllImport("user32.dll")] 
    static extern int wsprintf([Out] StringBuilder lpOut, string lpFmt, __arglist); 

    static void Main(String[] args) 
    { 
     var sb = new StringBuilder(); 
     wsprintf(sb, "%s %s %s", __arglist("1", "2", "3")); 
     Console.Write(sb.ToString()); 
    }  
} 

Il c'è modo standard di pinvoking metodi vararg, la maggior parte delle soluzioni saranno avvolgere in diversi metodi, ad es

[DllImport("MyDll", CallingConvention=CallingConvention.Cdecl)] 
static extern var MyVarArgMethods1(String fmt, 
    String arg1); 

[DllImport("MyDll", CallingConvention=CallingConvention.Cdecl)] 
static extern var MyVarArgMethods2(String fmt, 
    String arg1, String arg2); 
+0

Ho letto di questo prima. Perché non è documentato? – ChaosPandion

+0

probabilmente mancherà la scadenza per l'invio ECMA e ora MS non si impegna a quella parola chiave fino alla sua parte del sepc. –

+0

Questo ha senso. Inoltre non posso fare a meno di chiedermi perché usano '__arglist' piuttosto che' arglist'. – ChaosPandion

Problemi correlati