사용자 지정 COM 인터페이스에 대한 .net 래퍼를 만들려고합니다.마샬링 Char *. 모든 문자를 얻는 방법
인터페이스는 C++에서 다음과 같이 정의된다 :
DECLARE_INTERFACE_(IDumpAsf, IUnknown)
{
STDMETHOD(get_UserParams) (THIS_
int *is_auto_start,
int *fileSize,
int *packetSize,
char *baseName,
char *filePath
) PURE;
STDMETHOD(set_UserParams) (THIS_
int is_auto_start,
int fileSize,
int packetSize,
char *baseName,
char *filePath
) PURE;
STDMETHOD(enable_Run) (THIS_
bool is_run
) PURE;
};
그리고 C#에서이 같은 인터페이스 선언 :
int is_auto_start;
int fileSize;
int packetSize;
SByte baseName;
SByte filePath;
IDumpASF dump = (IDumpASF)asfWriter;
dump.get_UserParams(out is_auto_start, out fileSize, out packetSize, out baseName, out filePath);
:
public interface IDumpASF
{
[PreserveSig]
int get_UserParams(
[Out] out int is_auto_start,
[Out] out int fileSize,
[Out] out int packetSize,
[Out] out System.Sbyte baseName,
[Out] out System.SByte filePath
);
[PreserveSig]
int set_UserParams(
[In] int is_auto_start,
[In] int fileSize,
[In] int packetSize,
[In] string baseName,
[In] string filePath
);
[PreserveSig]
int enable_Run([In] bool a);
}
사용의 exsample에이입니다
나는 영혼을 구축하고 실행할 수는 있지만 모든 캐릭터를 어떻게 얻는 지 알지 못한다. baseName 및 filePath. SByte를 보내면 첫 번째 캐릭터를 되 찾을 수 있지만 나머지는 어떻게 얻습니까? Sbyte [], String, StringBuilder 및 IntPtr과 같은 여러 유형을 시도했습니다. 문자열로 변환하려고 할 때마다 AccessViolationException이 발생합니다.
내가 놓친 바보 같은 것이 있지만 내 환자는 여기에 얇은 것을 입는다.
도움이 많이 필요합니다.
-Svein
안녕 한스. 설명했듯이 StringBuilder를 사용하여이 작업을 수행 할 수 있습니다. 또한 SByte 배열을 사용하여 테스트를 수행했으며, MarshalAs (UnmanagedType.LPArray)를 사용하면 잘 작동합니다. 무엇에 대한 제안? – Svein
@Svein, StringBuilder가 표준 방법입니다. Encoding.Default.GetString()을 사용하여 byte []를 문자열로 다시 변환하지 않아도됩니다. –
Ok. 그럼 StringBuilder에 대해 알아 보겠습니다. 감사. – Svein