2010-01-23 2 views
7

네이티브 함수가 있습니다.var args를 사용하는 함수에 대해 올바른 PInvoke 서명은 무엇입니까?

int sqlite3_config(int, ...); 

이 함수에 대해 PInvoke를하고 싶습니다. 현재,이 선언이 있습니다 :

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

(Result 및 ConfigOption은 enum Result : int { ... } 형식의 열거 형입니다.)

사실이 함수의 단일 매개 변수 버전에만 관심이 있고 다른 함수는 필요하지 않습니다. args. 이 올바른지?

두 개의 인수 형식을 선언하는 방법에 대해서도 궁금합니다 (아마도 IntPtrs 2 개가 필요합니까?).

+0

** 가변 인수 기능에 대한 올바른 PInvoke 서명은 ** 무엇보다 Google 친화적 인 제목일까요? – ChaosPandion

+1

나는 C 전체 경력을 프로그래밍하고 있었고 아직도 ** variadic ** :-)이라는 단어를 기억할 수 없다. –

+1

컴퓨터 과학자들과 그 이상한 이름들! 분명히, arity는 ** 함수가 취할 수있는 인수의 수 **를 의미합니다. – ChaosPandion

답변

8

당신은 (문서화되지 않은)을 __arglist 키워드를 사용해야 바트 번호가 nice blog about it.

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()); 
    }  
} 

(가) 가변 인자 방법을 pinvoking의 표준 방법입니다했다, 대부분의 솔루션은 포장한다 예를 들어 여러 가지 방법으로

[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

나는 이것에 관해 전에 읽었다. 왜 그것이 문서화되지 않았습니까? – ChaosPandion

+0

은 아마도 ECMA 제출 마감일을 놓친 것이며 MS는 sepc의 일부가 될 때까지 해당 키워드에 커밋하지 않습니다. –

+0

그건 의미가 있습니다. 나는 또한 왜 그들이'arglist'보다는'__arglist'를 사용하는지 궁금하지 않을 수 있습니다. – ChaosPandion

관련 문제