반응형

C# 프로그래밍을 하다보면 C++에서 만들어 둔 DLL을 사용해야 할 경우가 많이 있지요.
in 기능의 인수들을 그냥 대충 바꾸면 되는데
out 기능의 포인터를 사용한 Call by Referance 인수들을 참 난감합니다.
그러나 아래와 같이 선언하면 사용이 가능합니다.
참고 하세요.

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace SolarCellDGUI
{
class SCMInterface
{

[DllImport!("P:SolarCell_CTCShellExecDllsSCMBusClient.dll")]
public static extern int ConnectToSCM(string MyIPAddr,
[MarshalAs(UnmanagedType.LPArray)] Int32[] ConnectionID,
[MarshalAs(UnmanagedType.LPArray)] byte[] EquipmentName);

[DllImport!("P:SolarCell_CTCShellExecDllsSCMBusClient.dll")]
public static extern int DisconnectFromSCM(string MyIPAddr, int ConnetionID);

[DllImport!("P:SolarCell_CTCShellExecDllsSCMBusClient.dll")]
public static extern int SendEventToSCM(int ConnectionID, string Source,
string Destination, string EventName, string EventData, int EventDataLen,
[MarshalAs(UnmanagedType.LPArray)] byte[] ResultData,
[MarshalAs(UnmanagedType.LPArray)] Int32[] ResultDataLen);


public bool SendEventSCM(int ConnectionID, string Source, string Destination,
string EventName, string EventData, int EventDataLen, ref string ResultData, ref int ResultDataLen)
{
int res = 0;
byte[] resData = new byte[100];
Int32[] resDataLen = new Int32[1];
char[] tempchr = new char[100];
int i;

res = SendEventToSCM(ConnectionID, Source, Destination, EventName, EventData,
EventDataLen, resData, resDataLen);

if (res == 1)
{
ResultDataLen = resDataLen[0];

for (i = 0; i < 100; i ++)
tempchr[i] = System.Convert.ToChar(resData[i]);
ResultData = new string(tempchr);
return true;
}
else
{
return false;
}

}

public bool ConnectSCM(string MyIPAddr, ref int ConnectionID, ref string EquipmentName)
{
int res = 0;
byte[] eqpName = new byte[80];
Int32[] conID = new Int32[1];
char[] tempchr = new char[80];
int i;

res = ConnectToSCM(MyIPAddr, conID, eqpName);

if (res == 1)
{
ConnectionID = conID[0];

for (i = 0; i < 80; i++)
tempchr[i] = System.Convert.ToChar(eqpName[i]);

EquipmentName = new string(tempchr);
return true;
}
else
{
return false;
}

}

public bool DisconnectSCM(string MyIPAddr, int ConnetionID)
{
int res = 0;

res = DisconnectFromSCM(MyIPAddr, ConnetionID);

if (res == 1)
return true;
else
return false;
}

}
}

반응형

'Program > C#' 카테고리의 다른 글

레지스트리 값 읽고, 쓰기 방법 2  (0) 2011.03.24
레지스트리에 값 읽고, 쓰고, 삭제  (0) 2011.03.24
C#에서 Win32 API 사용하기2  (0) 2011.03.24
웹페이지 자동로그인 구현  (0) 2011.03.24
급여 계산  (0) 2011.03.24

+ Recent posts