2012-12-29 1 views
0

내가 관리되지 않는 타사 응용 프로그램에서 DLL에 교류 # 함수를 호출하기 위해 노력하고있어에 C#을 DLL에서 문자열을 마샬링 - 그러나 Calling C# dll from unmanaged code에서 메타 트레이더콜링/관리되지 않는 코드

내가 따랐다 조언, 마샬링 문자열에 대한 예 작동하지 않습니다.

참고 : 참조 (함수 "추가")에서 정수 추가 예제를 성공적으로 호출했으며 문제없이 끝까지 작동하므로 문자열과 관련이 있다는 것을 알고 있습니다. 즉, "ReplaceString"함수가 작동하지 않습니다. 나는 또한 RobertGisiecke 웹 사이트를 보았지만 그곳에는 문자열 예제가 없거나 너무 멍청해서 알아낼 수 없다.

내가 메타 트레이더 얻을 오류 메시지는 다음과 같습니다

15시 27분 40초 2009년 11월 10일 0시 1분 MT4LibTest EURUSD, H1은 : 040B031B에서 기능 '하고 ReplaceString'전화 DLL에서 'Testme.dll'심각한 오류 C0000005 .

플랫폼에 Windows Server 2012 (64 비트)이며, 메타 트레이더는 86 프로그램이기 때문에 나는 86로 컴파일 한

한가지 더 : 임 바라고 누군가가 친절하게도을 할 수 있도록 내가 아주 VS 세계에서 경험하고 있지 않다 함수를 호출

[DllExport("ReplaceString", CallingConvention = CallingConvention.StdCall)] 
    public static int ReplaceString(
     [In, Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder str, 
     [MarshalAs(UnmanagedType.LPWStr)]string a, 
     [MarshalAs(UnmanagedType.LPWStr)]string b) 
    { 
     str.Replace(a, b); 

     if (str.ToString().Contains(a)) return 1; 
     else 
      return 0; 
    } 

(메타 트레이더) :

감사합니다

C# 코드 도움

#import "MT4Lib.dll" 
    int ReplaceString(string & str,string a,string b); 
    int Add(int x, int y); 
#import 
    string str="A quick brown fox jumps over the lazy dog"; 
    string stra = "fox"; 
    string strb = "cat";   

    Print(str); 
    Print(ReplaceString(str,stra,strb)); 
    Print(str); 

편집 : 내가 하나가 쓸 수있는 메타 트레이더 API는 '스크립트'허용하지 않는 것이 분명 전체 C++ 유형을 확인해야합니다. 따라서 char, wchar 및 이러한 유형의 포인터가 없습니다. "문자열"만.

+0

에 오신 것을 환영합니다. C++ 응용 프로그램에 C++ 문자열을 전달할 수 없습니다. 아마도'wchar * '으로 만들어야 할 것이다.관련 질문도 참조하십시오 (오른쪽). 예를 들면 다음과 같습니다. http://stackoverflow.com/questions/643202/send-c-string-to-c-sharp-string-interop –

+0

C++ 객체를 인수로 사용하는 함수를 pinvoke 할 수 없습니다. –

+0

이렇게하려면 'C++ calling C#'일을 대신 COM을 사용하는 것이 좋습니다. C#에서 COM 개체를 만들고 C++에서 사용합니다. –

답변

0

해결책을 찾았습니다!

먼저 답장을 보내 주신 모든 분들께 감사드립니다. 신기술 (나에게있어)에 대한 이해는 다소 어려웠다. @Jim : 내가 추가 한 EDIT를 참조하십시오. MQL (metatrader 언어)은 C++을 기반으로 할 수 있지만 응용 프로그램 설계자가 중점을 두었습니다. 따라서 wchar 유형이 없습니다. @Simon : NuGet 패키지 "UnmanagedExports"에 대한 참조를 추가하면 래퍼가 배치되고 CIL 픽스 업이 처리되므로 코드에 집중할 수 있습니다. 질문에 포함 된 링크는 이것을 자세히 설명합니다. , C#을 함수에서 문자열 인수가 LPWSTR (와이드 스트링)로 선언했다 주어진 샘플 코드에서

  1. :

    두 코드에 문제가 그대로 있었다. 디버거에서 그들을 보았을 때 중국인이 등장했습니다. LPStr은 정상적으로 작동합니다.

    샘플 코드에는 호출자 (원시) 코드의 인수로 선언 된 문자열에 대한 포인터도 있습니다. 이것을 제거하고 StringBuilder 클래스를 사용하여 관리되는 C# 코드의 문자열을 변경했습니다. 에 StackOverflow에

    #import "MT4Lib.dll" 
        int ReplaceString(string str,string a,string b); 
        int Add(int x, int y); 
    #import 
    
+0

문자열을 MQL 터미널에 마샬링하려는 경우이 링크는 매우 유용합니다. https://www.mql5.com/en/articles/249 – opewix