2016-09-27 2 views
0

VisualBasic으로 작성된 오래된 DLL이있어서 C#에서 함수를 호출해야합니다. 15 개의 기능 중 14 개의 기능이 이미 실행 중입니다 (콘솔 프로젝트로 테스트 됨). 나머지 함수는 어디 C#에서 호출하는 방법을 모르는 paramater PChar 있습니다.C#에서 VisualBasic DLL을 호출하지만 Pchar을 대체하는 방법은 무엇입니까?

실제로 동작 기능은 다음과 같다 :

[DllImport("C:\\DLL\\visualbasic.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] 
public static extern int command(out UInt32 pNumber); 

public void Executecommand(out UInt32 pNumber, out int Res) 
{ 
Res = command(out pNumber); 
} 

워킹 기능하지 두 파라미터 가지고 pData의 아웃 1.를 PChar를 2 CONST pDataLen (이 리턴되는 데이터의 길이)

VB DLL의 설명서에 따르면 함수를 호출하기 전에 메모리를 예약하고 함수가 끝나면 메모리를 확보하는 것이 중요합니다. 20 자이면 충분합니다.

누군가가 함수를 호출하는 방법에 대한 힌트를 줄 수 있습니까? 간단히 "문자열"을 사용하면 예외가 발생합니다. 처리되지 않은 예외 인 System.AccesViolationException이 발생했습니다. 추가 정보 : 보호 된 메모리를 읽거나 쓰려고 시도했습니다. 이것은 종종 다른 메모리가 손상되었다는 표시입니다.

도움 주셔서 감사합니다.

+1

그건별로 도움이되지 않는 내용입니다. PChar는 델파이 타입이며, "out"과 "const"는 의미가 없습니다. 대부분의 올바른 인수 유형은 StringBuilder이며, RefSet 또는 Out이없고 CharSet.Ansi가 있습니다. 통화하기 전에 용량을 20으로 설정하십시오. 두 번째 주장은 반드시 int 일 뿐이지 만 심판이 필요한지 추측하기는 어렵습니다. –

+0

나는 stringbuilder를 시도했다. 내가 "아웃"을 사용하지 않으면 함수가 실행되지만 stringbuilder 변수에 데이터가 없습니다. 내가 stringbuilder 변수에서 out 매개 변수를 사용하면 첫 번째 게시와 동일한 오류가 발생합니다. public void NotWorking (out 문자열 pData, int pDataLen, out int Res) { StringBuilder MyStringBuilder = new StringBuilder ("", 20); Res = Execute_NotWorking (MyStringBuilder, pDataLen) pData = MyStringBuilder.ToString(); } –

답변

0

포인터로 시도 했습니까 ??

public static extern void NotWorkFunction(out IntPtr pOut, int someConst) 

void Main(string[] args) 
{ 
    IntPtr pOut; 
    int dataLength; 
    string foo; 

    NotWorkFunction(pOut, dataLength); 
    foo = Marshal.PtrToStringAuto(pOut); 
    BlockFree(pOut); 
} 
+0

안녕하세요, 아아이, 답변 주셔서 감사합니다. 내 코드를 변경했지만 이전과 같은 오류 메시지가 표시됩니다. –

-1

해결책은 "out string"대신 "ref string"을 사용하는 것이 었습니다.