2009-05-06 6 views
2

int*을 C# 프로그램에 반환하는 C++ DLL이 있습니다. 문제는 C#의 int*이 할당 후 null 인 채로 남아 있다는 것입니다.C#에서 IntPtr을 int *로 변환 하시겠습니까?

IntPtr에 C++ 결과를 할당 할 때 올바른 null이 아닌 값을 얻습니다. 그러나이를 int*으로 변환하면 null이됩니다.

나는 시도했다 :

IntPtr intp = cppFunction();   // Non-null. 

int* pi = (int *) intp;     // Results in null. 

int* pi = (int *) intp.ToPointer(); // Results in null. 


void* vp = intp.ToPointer(); 

int* pi = (int *) vp;     // Results in null, but vp is non-null. 

이 어떻게 널이 아닌 int*을받을 수 있나요?

감사합니다. 앨런

+0

나는대로 MSVCRT.DLL에서 표준의 malloc() 함수를 사용 "cppFunction()". 그것은 나를 위해 괜찮 았는데, 심지어는/할당 된 메모리 위치를 쓸 수 있습니다. intp (IntPtr intp = (IntPtr) 1000;)에 임의의 숫자를 할당하면 역 참조하는 경우에만 NullPointerException이 발생합니다. 그래도 포인터의 값이 null이 아니 었습니다 ... 잘못된 결과를 생성하는 작고 완전한 프로그램을 제공 할 수 있습니까? – Hali

+0

필요한 메모리가 할당 된 IntPtr을 전달할 수 있도록 C++ 리팩토링 옵션이 있습니까? 그 방법이 더 좋을 것입니다 - 또는 콜백을 연결하여 C#에서 메모리를 할당하십시오 http://stackoverflow.com/questions/9378626/how-can-i-return-a-stringbuilder-or-other-string- buffer-from-a-pinvoke-native-ca – dice

답변

4

당신 cppFunction 선언해야 뭔가 같은 : 당신의 문제를 해결해야

void cppFunction(ref int* ptr) { 
    ptr = somevalue; 
} 

.

이 유용도 찾을 수 있습니다 : http://www.pcreview.co.uk/forums/thread-2902012.php

+0

James에게 감사드립니다. 나는 다음과 같은 방법을 시도 : [DllImport ("EntryPoint = @"? getLineContentsAsArg @@ YAXAAPAH @ Z ")] public static unsigned void getLineContentsAsArg (ref int * lca); DLLEXPORT void getLineContentsAsArg (int * & lca) { \t lca = calculateLineContents(); } 포인터 값이 DLL에 할당되지만 C#으로 돌아 오면 null입니다. 예제를 살펴보면서 마지막 예제 만 C#의 포인터 변수에 할당하려고 시도합니다. 이 작업을 시도 할 때마다 할당 결과가 null입니다. 내가 잘못하고있는 것을 볼 수 있습니까? 감사합니다. – user20493

+0

나는 잔디 깍기를 끝내면 더 자세히 살펴볼 필요가 있지만, 최근에 내가 해결 한 방법은 C#에서 버퍼를 할당하고 IntPtr과 함께 길이를 가져 오는 포인터를 관리되지 않는 코드로 보냈다는 것을 깨달았습니다. . 당신이 마주 치게되는 문제는 아마도 C++ 함수가 malloc을 수행하고 문자열을 반환 할 것으로 기대하고 있기 때문일 것입니다. 이 경우 포인터에 포인터를 전달해야 할 필요가 있지만 C#으로 작업을 끝내면 어떻게 자유롭게 할 것인지 확신 할 수 없습니다. –