2009-11-02 6 views
1

그래서 내 관리되지 않는 C++ DLL에있는 함수를 호출하려고합니다. 내 C# 응용 프로그램에서 Windows Mobile 플랫폼에서 PInvoke

void foo(char* in_file, char * out_file) 

나는

[DllImport("dll.dll")] 
public static extern void foo(byte[] in_file, byte[] out_file); 

나는이 같은 ASCII 인코더를 통과 실제 매개 변수를 같은 함수를 선언 그래서

byte[] param1 = Encoding.ASCII.GetBytes(filename1); 
byte[] param2 = Encoding.ASCII.GetBytes(filename2); 
foo(param1, param2); 

모든 때 길이를 제외하고, 작동 param1은 0 또는 36 또는 72 자 (바이트)입니다. 그런 다음 몇 가지 이유로 DLL은 수신 된 길이 1, 38, 73을 0x16 문자가 맨 끝에 첨부 된 것으로보고합니다.

저는 왜 반기는 디버깅을 시도하고 왜 이런 일이 일어나는지 이해하려고합니다. 어떤 아이디어? 36의 배수의 의미는 무엇입니까?

편집/솔루션 :

나는 가능한 대답이 생각 난이 게시 된 후. 바이트 배열로 변환하기 전에 문자열 끝에 null 문자 0x0을 추가하여이 문제를 해결했습니다. 그게 의도적인지는 모르겠지만.

답변

2

당신은 스스로 답을 찾았습니다 - 길이가 함수에 전달 된 곳이 없습니다.

이러한 기능을 실행하는 기능과 ASCII가 실제로 필요한 것인지 여부를 신중하게 생각해야합니다.

당신은 아마 정말이 원하는 어떤 ASCII 인코딩 정렬 화 된 형식에서 명시 적으로 필요하고 널 (null) 종단 :

[DllImport("dll.dll")] 
public static extern void foo(
    [MarshalAs(LPStr)] string in_file, 
    [MarshalAs(LPStr)] string out_file); 

하지만 당신의 foo는() 구현을 확인하고 당신이 정말로 전달 될 것으로 예상 무엇을 알고 있어야합니다 in.