본문 바로가기

WPF 개발 ( C# )

WPF ( C#) 에서 VC++ 로 만든 DLL 호출하기

C++로 만든 DLL 파일명은 WebCrawling0.dll 로 한다


1. 구조체를 이용한 호출의 예


1.1 C++ 에서의 작업


1.1.1 구조체 선언


typedef struct Process_Struct_tag {

int nCmd;

char  szParam1[512];//string

char  szParam2[512];//string

int   nErrorCode;

}Process_Struct, *PProcess_Struct;


1.1.2 dll 의 외부표출 함수 정의 (.def 파일을 사용해도 된다)

//extern "C"  __declspec(dllexport) int* ProcessControl_int(Process_Struct *ps);
extern "C"  __declspec(dllexport) char* ProcessControl(Process_Struct *ps);

1.1.3 실제 동작하는 함수 원형

char* ProcessControl(Process_Struct *ps)
{
static char szReturn[512];
strcpy(szReturn, "리턴문자열");

ps->nErrorCode = 0;

printf( "cmd=%d, param=%s\n", ps->nCmd, ps->szParam1 );

return szReturn;
}

1.2 C# 에서의 작업

1.2.1 구조체 선언

public struct Process_Struct
{
public int nCmd;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)] public String szParam1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)] public String szParam2;
public int nErrorCode;
 }

1.2.2  WebCrawling0.dll 을 임포트 할 class CrawlDll 정의

internal class CrawlDll
{

//[DllImport("WebCrawling0.dll", CallingConvention = CallingConvention.Cdecl)] extern public static IntPtr ProcessControl_int(ref Process_Struct ps);

[DllImport("WebCrawling0.dll", CallingConvention = CallingConvention.Cdecl)] extern public static string ProcessControl(ref Process_Struct ps);


}


1.2.3 dll의 함수를 호출하는 부분


Process_Struct ps;

ps.nCmd = 0x1010;

ps.szParam1 = "WebCache";



string szReturn = CrawlDll.ProcessControl(ref ps);


if (ps.nErrorCode != 0)

MessageBox.Show(ps.nErrorCode.ToString() + ps.szParam2);





------------------------

참조 ( 리턴이 char* 인데 int*로 (C#에서는 IntPtr) 정의 해도 아래와 같이 마샬링을 하면 int* 를 string으로 변한하여 사용할 수 있다)

            IntPtr ntReturn = CrawlDll.ProcessControl_int(ref ps);

            string szReturn = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(ntReturn);

            System.Diagnostics.Debug.WriteLine($"szResutn = {szReturn}");