2011-10-05 2 views
1

나는 미쳐 갈 것입니다.DLLImport get 보호 된 메모리를 읽거나 쓰려고 시도했습니다.

I는이 기능, DLL을 가지고

function MyFunc(myId: integer; var LstCB: array of char): integer; stdcall; 

첫번째 파라미터는 불량한 정수이다.

[DllImport(@"MyDll.dll", EntryPoint = "MyFunc", CallingConvention = CallingConvention.StdCall)] 
internal static extern int MyFunc(int myId, string list); 

내가 얻을 :

Attempted to read or write protected memory. This is often an indication that other memory has been corrupted. 

당신에게 몇 가지를 가지고 그러나 두 번째는 문자 내가 같이 DllImport와이 수입이

('9', #13, #10, '8', '8', '8', '8', '0', '0', '0', '0', '0', '0', '0', '0', '2', '5', '0', '7', #13, #10, '8', '8', '8', '8', '0', '0', '0', '0', '0', '0', '0', '0', '2', '6', '0', #13, #10, '8', '8', '8', '8', '0', '0', '0', '0', '0', '0', '0', '0', '3', '3', '1', '5', #13, #10, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0,....#0) 

같은가 someting를 얻을 수 [2048]입니다 아이디어 제발 ???

감사합니다.

답변

4

Delphi 함수가 문자열 매개 변수에 열린 배열을 사용하고 있습니다. 이것은 DLL 경계를 통해 노출되어야하는 것이 아닙니다. Delphi 오픈 어레이를 호출하기위한 프로토콜은 구현에 따라 다릅니다.

PChar을 받으려면 Delphi 코드를 변경해야합니다.

function MyFunc(myId: Integer; LstCB: PChar): Integer; stdcall; 

데이터가 C#에서 Delphi DLL로 전달되는 경우 P/invoke가 정상입니다. DLL이 C# 코드로 데이터를 반환하기위한 것이라면 P/invoke에서 텍스트 매개 변수를 StringBuilder으로 선언해야합니다.

[DllImport(@"MyDll.dll", EntryPoint = "MyFunc", CallingConvention = CallingConvention.StdCall)] 
internal static extern int MyFunc(int myId, StringBuilder list); 
... 
StringBuilder list = new StringBuilder(2048); 
int res = MyFunc(ID, list); 
string theList = list.ToString(); 

조심하는 유일한 다른 점은 char의 의미가 델파이에있는 것입니다. DLL이 Delphi 2009 또는 이후 버전으로 빌드 된 경우 char은 유니 코드 문자이므로 P/invoke에 CharSet을 지정해야합니다.

+0

이 작업이 실패하는 이유는 스택의 불균형 때문입니다. "array of char"(array.Length 바이트)의 크기는 C# 문자열 포인터 (4/8 바이트)와 같지 않으므로 매개 변수가 스택을 오염시키고 정의되지 않은 동작을 발생시킵니다. – Polynomial

+0

고마워, 너 너무 많이, 나는 이것을 시도 할 것이다. – Tkanos

관련 문제