2013-08-06 6 views

답변

4
[DllImport("YourDll.dll", CharSet = CharSet.Ansi)] 
//[return: MarshalAs(UnmanagedType.Bool)] // This line is optional, and it's implicit 
static extern bool GetServerName(int index, StringBuilder buffer, int bufSize); 

이 기능을 사용하려면

int bufSize = 100; 
StringBuilder buffer = new StringBuilder(bufSize); 
bool result = GerServerName(0, buffer, bufSize); 

if (result) 
{ 
    string buffer2 = buffer.ToString(); 
} 

기술적으로 귀하의 질문에 ... 응답은 "LPSTR과 동일 무엇"이었다 string 또는 StringBuilder 당신이 메서드에 문자열을 전달하는 경우, StringBuilder 메서드가 문자열을 전달하는 경우. 또 다른 대안은 같은 사용자 스스로 byte[]을 사용하고 Encoding/Decoding하고있다 :. 널 (null) 종료됩니다

[DllImport("YourDll.dll", CharSet = CharSet.Ansi)] 
//[return: MarshalAs(UnmanagedType.Bool)] // This line is optional, and it's implicit 
static extern bool GetServerName(int index, byte[] buffer, int bufSize); 

int bufSize = 100; 
byte[] buffer = new byte[bufSize]; 
bool result = GerServerName(0, buffer, bufSize); 

if (result) 
{ 
    string buffer2 = Encoding.Default.GetString(buffer, 0, Array.IndexOf(buffer, (byte)0)); 
} 

(C 문자열 우리는 Array.IndexOf(buffer, (byte)0) 가진 첫번째 \0을 찾아 우리까지 문자를 변환 Encoding.Default.GetString() 인 문자열에 대한 null). 일반적으로 이러한 방법은 어떤 방법으로 문자열의 길이를 반환으로 작성되기 때문에

일부 의견 ...

  1. 나는, 당신이 (상수와 같은) 버퍼의 최대 길이가 있기를 바랍니다.
  2. 유니 코드 버전의 메서드 (아마도 GetServerNameW)를 사용하는 경우 사용해야합니다. Unicode 메소드가있는 경우 사용하는 것이 더 좋으므로 Ansi가 아닌 문자는 손실되지 않습니다.

편의 상으로는 DllImport을 사용할 때 올바른 호출 규칙을 사용하고 있는지 확인해야합니다. Windows API의 경우에는 아무 것도 할 필요가 없지만 헤더 파일에 메서드가 정의 된 방법에 따라 CallingConvention = CallingConvention.something을 추가해야 할 수 있습니다. 종종 (하지만 지금은 항상) .NET 런타임은 잘못된 호출 규칙에 대한 예외를 throw하거나 메서드가 작동하지 않고 이상한 것을 반환하거나 충돌합니다. 이는 호출 규칙에 따라 메서드에 매개 변수를 전달해야하는 방식 (어디에서 어떻게, 누가 기술적으로 스택을 해제해야하는지)이 .NET에 알려지기 때문입니다. 헤더 파일에있는 호출 규칙의 예는 cdecl, stdcall, fastcall, thiscall, pascal (stdcall과 동일), WINAPI, APIENTRY (WINAPI와 동일), CALLBACK (WINAPI와 동일) 및 _ 또는 _ 모든 대문자로. Microsoft VC++는 일반적으로 C 메소드 용 cdecl 호출 규칙과 C++ 메소드 용 thiscall을 사용합니다. 일부 arguments을 통해 제어 할 수 있습니다.

+1

엄밀히 말하면,'CharSet.Ansi'도 함축되어 있습니다. 그러나 그것은 내가 예상했던 것이 아니기 때문에 생략하지 않는 것이 좋습니다. 명확성을 위해 명시 적으로 잘못된 것은 없습니다! –

+0

@CodyGray 나는 그것이'CharSet.Auto'라고 생각했다 :-) 그냥 체크하고 맞았다. 그러나 나는 또한 항상 명시 적으로'CharSet'을 설정했습니다. 나는'CharSet.Auto'를 신뢰하지 않았다 :-) – xanatos

+0

감사합니다. ..... 잘 작동합니다 ..... – mahua22