2016-12-05 3 views
1

Powerbuilder에서 '클래식'DLL C# (COM이 아님)을 호출해야합니다. 이 예제를 기반으로하는 C# I의 DLL 생성은 RGiesecke dll Export template입니다.Powerbuilder에서 C# DLL (RGiesecke dll 내보내기 템플릿)을 호출합니다.

그리고 Powerbuilder에서 DLL을 호출 할 수있었습니다.

는하지만 '참고로'문자열을 전달하려는 : 그래서 나는 함수 선언에 '심판'을 추가 :

[DllExport("ExpTest", CallingConvention = CallingConvention.Winapi)] 
[return: MarshalAs(UnmanagedType.LPWStr)] 
public static string ExpTest([MarshalAs(UnmanagedType.LPWStr)] ref string sText, out int length) 
{ 
    MessageBox.Show(sText, "ExpTest"); 
    length = sText.Length; 
    //sText = "def"; 
    return sText; 
} 

이 함수를 호출 파워 빌더에서 코드 :

String ls_arg, ls_ret 
ls_arg = "abc" 
long ll_len 
ls_ret = ExpTest(ls_arg, ll_len) 
messagebox(ls_arg, ls_ret) 

(문자열 'sTest'선언에 'ref'없이) 원래의 functio를 호출하면 "abc"를 반환합니다. '문자열 sTest'선언에 'ref'를 추가하면 '중국어 문자'가 반환됩니다.)

아무도 도와 줄 수 있습니까? 더 나은 방법 : Powerbuilder에서 문자열 배열을 (ref로) 전달하는 방법은 무엇입니까?

도움 주셔서 감사합니다.

Msc. 기능 문자열 ExpTest (REF 문자열 값, REF 긴 렌) LIBRARY "Classicdll.dll"
- - 기능 문자열 ExpTest (문자열 값, REF 긴 렌) LIBRARY :

는 다음과 같이 파워 빌더에서 외부 함수를 정의하는 시도 "Classicdll.dll"
- 둘 다 ALIAS FOR "ExpTest; Ansi"...

+0

PoweBuilder에서. "로컬 외부 함수"에서 어떻게 처리됩니까? –

+0

안녕하세요 Eduardo, 게시물에 사용 된 선언문을 추가했습니다 .... – MSC

답변

1

ref를 사용하지 마십시오. 객체가 포함하고 있지 않은 것을 변경하고 싶을 때만 ref를 사용해야한다! .NET의 문자열은 특수한 개체입니다. 그들은 가치 유형처럼 행동하지만 참조 유형입니다. 자세한 내용은 여기에서 찾을 수 있습니다 :

+0

안녕하세요 @ user743414, 답변 해 주셔서 감사합니다. 사실, C# COM DLL은 쉽게 할 수 있지만 레지스트리에 등록해야 PowerBuilder에서 호출 할 수 있으며,이 경우에 피할 필요가 있습니다. 나는 '등록 무료 COM DLL'(매니 페스트 생성)을 구현하려고하지만 현재 (파워 빌더와 함께) 작동하지 못한다. (둘 다 아님). – MSC

+0

@MSC unmanged exports 샘플을 시험해 보았습니다. .NET CallingConvention.StdCall 및 프로젝트 속성 -> 빌드 -> x86에서 선택했는지 확인하십시오. 내게 이메일 주소를 주면 .NET 4.5.2 샘플 * .dll 소스와 pb12.5 샘플 응용 프로그램 소스를 보낼 수 있습니다. – user743414

+0

안녕하세요 @ user743414 : \t 정말 멋지고 감사하겠습니다! [email protected]에서 연락 할 수 있습니다. – MSC