C# 에서 C++ DLL 불러서 쓰기 #3

Programming/C# 2018. 2. 13. 15:49 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

C# 에서 C++ DLL 불러서 쓰기 #3















3. Class 가져오기



C++ DLL 에



#ifdef BOX_EXPORTS

#define BOX_API __declspec(dllexport)

#else

#define BOX_API __declspec(dllimport)

#endif











C++


Class BOX_API Box{

public:

Box();

int setInt(int a);

void setString(char* str);

}








이런 클래스가 존재하고






C# 에서 해당 클래스를 불러서 사용하려고 한다,









C#



namespace BoxConsoleApplication

{

    class Program

    {


        unsafe static void Main(string[] args)

        {

             Box b = new Box();

             int c = b.setInt(3);

             b.setString("HelloWorld");


        }

    }

}



이렇게 사용하고 싶다.












하지만 바로 저렇게 사용 할 수는 없다.






참조하여도 해당 멤버들이 [개체브라우저]에 보이지 않는 멤버들을 직접 명시하여 참조해 주어야한다.











C++ 클래스가 보이지 않으므로


C++ 클래스를 활용 할 수 있는 전역 함수들을 만들어서


명시하여 C# 에서 사용한다.



C++


Class BOX_API CBox{

public:

CBox();

int setInt(int a);

void setString(char* str);

}






.h File


extern "C" BOX_API Box* CreateCBox();

extern "C" BOX_API void DisposeCBox(CBox* pObject);







.c File


extern "C" BOX_API CBox* CreateCBox()

{

return new CBox();

}


extern "C" BOX_API void DisposeCBox(CBox* pObject)

{

if (pObject != NULL)

{

delete pObject;

pObject = NULL;

}

}




CBox 객체를 만들고 해당 객체를 반환하고,


CBox 를 받아서 해당 객체를 지워주는 함수 2개를 일단 생성한다.




함수 원형과 함수 구현을 .c , .h 파일로 나누어 두었는데,


.h 에 모두 구현하게 되면


.h(104): error C2491: 'CreateCBox' : dllimport 함수을(를) 정의할 수 없습니다.


라는 에러를 보게 될 것이다.







만들어진 C++ 의 Create, Dispose 함수를 C# 에서 사용 해 본다.









C#



namespace BoxConsoleApplication

{

    class Program

    {


        [DllImport("Box.dll", CallingConvention = CallingConvention.Cdecl)]

        static public extern IntPtr CreateCBox();

        

        

        [DllImport("Box.dll", CallingConvention = CallingConvention.Cdecl)]

        static public extern void DisposeCBox(IntPtr pTestClassObject);


        unsafe static void Main(string[] args)

        {


            IntPtr pCBoxClass = CreateCBox(); ;


            DisposeCBox(pCBoxClass );            


            pCBoxClass = IntPtr.Zero; 


        }

    }

}







이렇게 하면


C++ DLL 의


클래스가


만들어진다.





나머지 멤버 함수들을 가져오는 것은 다음에 정리한다.










wave player class

Programming/MFC 2017. 9. 27. 11:14 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

wave player class



1. mciCommand  (적극 권장)

KMedia.h  KMedia.cpp




2. vfw 
KMp3.h  KMp3.cpp




3. directShow 

mp3.h  mp3.cpp


openssl AES encrypt (AES_ctr128_encrypt)

Programming/C,CPP,CS 2016. 9. 19. 08:50 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

openssl AES encrypt (AES_ctr128_encrypt)



Sample Class













AESCTR.cppAESCTR.h


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

c# dll ClassLibrary 에서 MessageBox.Show(text,title);


c# dll 을 만들다가


c#의 MessageBox를 사용하고 싶을때가 있다.



그럴때는


바로


using System.Windows.Forms;


하면 안 되고




System.Windows.Forms 을 참조 해주어야한다.




VS2013


[프로젝트이름]우클릭 -> [추가] -> [참조] -> [어셈블리] -> [프레임워크] -> [System.Windows.Forms] 를 체크해주면 해당 라이브러리를 자동으로 참조해준다.



그 다음 



using System.Windows.Forms;



를 쓰고


MessageBox.Show("mySocket is Null", "strTitle");


MessageBox 를 사용하면 된다.



C# Class Library use in script

Programming/C,CPP,CS 2016. 4. 5. 16:58 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

C# Class Library use in script




C# Class Library



namespace ClassLibrary2

{

    // Interface declaration.

    public interface ICalculator

    {

        int Add(int Number1, int Number2);

    };

    [ProgId("Test.SimpleCalc")]

    public class SimpleCalc : ICalculator

    {

        public int Add(int Number1, int Number2)

        {

            return Number1 + Number2;

        }

    }

}





이런 형태 일때

JavaScript 에서 부르는 방법



JavaScript 에서는 주로 


요런 형태로 DLL 을 로드한다.


<object name="Class1" id="Class1" classid="CLSID:*-*-*-*" width="0" height="0"></object>


일단 임의의 CLSID 를 만들어낸다


Visual Studio [도구] [GUID 만들기] 로 GUID 를 하나 만들어 낸다.



{3963CDD9-1079-463A-BCDA-0182D296C9B6}


namespace ClassLibrary2

{

    // Interface declaration.

    public interface ICalculator

    {

        int Add(int Number1, int Number2);

    };

    [ProgId("Test.SimpleCalc")]

    [Guid("3963CDD9-1079-463A-BCDA-0182D296C9B6")]

    public class SimpleCalc : ICalculator

    {

        public int Add(int Number1, int Number2)

        {

            return Number1 + Number2;

        }

    }

}



객체에 GUID 를 설정한다.




그다음 regasm 으로 등록한다.

등록할때 /codebase 옵션을 붙여야한다.

codebase 옵션을 붙이려면 어셈블리 서명이 필요하다.


어셈블리 서명은

Properties

[서명]

[어셈블리 서명] 에서 

새로만들기로 편한대로 만들면된다

키 파일 이름, 암호 없음







그다음 html 에서

<object name="Class1" id="Class1" classid="CLSID:3963CDD9-1079-463A-BCDA-0182D296C9B6" width="0" height="0"></object>

    <script>
        function TestAdd() {
            var ctrl = document.getElementById("Class1");
            ctrl.Add(13,4);
        }
    </script>





실행하면 잘 된다.





336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

C# Class Library use in java (클래스 라이브러리)



Java 에서 C# 클래스 라이브러리를 불러오기




C# 클래스 라이브러리가


namespace ClassLibrary2

{

    // Interface declaration.

    public interface ICalculator

    {

        int Add(int Number1, int Number2);

    };

    public class SimpleCalc : ICalculator

    {

        public int Add(int Number1, int Number2)

        {

            return Number1 + Number2;

        }

    }

}



그리고

잊지 말아야할 설정들



[assembly: ComVisible(true)]


COM Interop 등록





JACOB 라이브러리를 활용하여 C# DLL 을 불러와 보겠다.



http://danadler.com/jacob/


에 들어가서 기본 라이브러리를 추가한다.




jacob.jar 를 Java Build Path 에 추가한다.


ActiveXComponent xl = new ActiveXComponent("Test.SimpleCalc");


try {

   System.out.println(Dispatch.call(xl, "Add", new Variant(1), new Variant(2)));

} catch (Exception e) {

e.printStackTrace();

}


JACOB 라이브러리는 기본적으로는 ProgID 를 통해 DLL 파일을 불러온다.




위의 C# 클래스 라이브러리는 ProgID 가 없다.


namespace ClassLibrary2

{

    // Interface declaration.

    public interface ICalculator

    {

        int Add(int Number1, int Number2);

    };

    [ProgId("Test.SimpleCalc")]

    public class SimpleCalc : ICalculator

    {

        public int Add(int Number1, int Number2)

        {

            return Number1 + Number2;

        }

    }

}



ProgID 를 추가하여 준다.




그 다음 해당 파일을 regasm 으로 등록한다.



그런 다음 Java 를 실행해 보면


Add 가 정상적으로 작동한다.


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

C# Class Library


VS2013


새 프로젝트 -> Visual C# -> 클래스 라이브러리 -> 프로젝트 이름(Library 이름이 된다, 예제에서는 ClassLibrary2 이다.) -> 


자동으로 Class1.cs 파일이 만들어진다.


이 Class1.cs 가 DLL 에서 불러쓸 객체의 이름이 된다.



참고 : https://support.microsoft.com/en-us/kb/828736




Class1.cs 를 우클릭하여 이름바꾸기 원하는 객체 이름으로 바꾼다.




예제에서는 SimpleCalc 로 진행한다.



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


SimpleCalc.cs


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


namespace ClassLibrary2

{

    public class SimpleCalc

    {

    }

}


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



interface 를 추가 구현한다.

// Interface declaration.
public interface ICalculator
{
    int Add(int Number1, int Number2);
};



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


SimpleCalc.cs


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


namespace ClassLibrary2

{

    // Interface declaration.

    public interface ICalculator

    {

        int Add(int Number1, int Number2);

    };

    public class SimpleCalc

    {

    }

}



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


interface를 상속 받고

interface 로 부터 상속받은 메서드를 구현한다.


// Interface implementation.
public class ManagedClass:ICalculator
{
    public int Add(int Number1,int Number2)
        {
            return Number1+Number2;
        }
}




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


SimpleCalc.cs


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


namespace ClassLibrary2

{

    // Interface declaration.

    public interface ICalculator

    {

        int Add(int Number1, int Number2);

    };

    public class SimpleCalc : ICalculator

    {

        public int Add(int Number1, int Number2)

        {

            return Number1 + Number2;

        }

    }

}




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


이제


Properties 를 열어서


AssemblyInfo.cs 를 열어보면


[assembly: ComVisible(false)] 를 찾아서



[assembly: ComVisible(true)]


로 변경한다.



[assembly: ComVisible(true)] 로 바꾸어야 ActiveX 로 사용이 가능하다.





이제 빌드하면


bin/Debug 폴더에


ClassLibrary2.dll 파일이 만들어진다.



궁극적으로 배포를 목적으로 하므로


Release 모드로 바꾸어준다.




빌드를 하게 되면


ClassLibrary2.dll 파일이 만들어진다.



하지만 클래스 내부의 구조가 보이게 하려면


tlb 파일이 필요하다


이 파일은


ClassLibrary2 프로젝트이름을 더블클릭하면 뜨는 속성 창에서


[빌드]


COM Interop 등록 을 체크해준다.


그러면 이제부터 빌드를 하면 tlb 파일도 같이 만들어진다.





tlb 파일과 dll 파일을 C# DLL 을 사용할 프로젝트의 폴더로 복사한다.




예제에서는 MFC 에서 해당 DLL 파일을 불러서 사용해보겠다.



사용할 cpp 파일에서



#import "ClassLibrary2.tlb" raw_interfaces_only

using namespace ClassLibrary2;


를 선언한다.





그 후 사용을 원하는 함수에서




HRESULT hr = CoInitialize(NULL);


// Create the interface pointer.

ICalculatorPtr pICalc(__uuidof(SimpleCalc));


long lResult = 0;


// Call the Add method.

pICalc->Add(5, 10, &lResult);


SetDlgItemInt(IDC_STERM, (int)lResult);


// Uninitialize COM.

CoUninitialize();





이렇게 사용을 하면 된다.



ICalculatorPtr 은 Interface 로 만든  ICalculator 의 스마트포인터이다


ICalculator* 와 같다.





pICalc-> 을 통해 내부에 있는 속성과 메서드에 접근이 가능하다.








336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
package com.tansanc.tistory;

class Store
{
	private T[] data = (T[]) new Object[0];

	void add(T o)
	{
		if (data.length == 0)
		{
			data = (T[]) new Object[1];
			data[0] = o;
		} else
		{
			T[] temp = data;
			data = (T[]) new Object[data.length + 1];
			for (int i = 0; i < temp.length; i++)
			{
				data[i] = temp[i];
			}
			data[temp.length] = o;
		}
	}

	T get(int i)
	{
		return data[i];
	}
}

public class Test
{
	public static void main(String[] args)
	{
		Store s = new Store();
		s.add(3);
		s.add(4);
		System.out.println((Integer) s.get(0) + (Integer) s.get(1));
	}
}

'Programming > JAVA,JSP' 카테고리의 다른 글

JAVA 타자연습 프로그램  (0) 2013.08.13
JAVA Console Token 구현  (0) 2013.08.07
JAVA DRAG 가능한 Component 만들기  (0) 2013.08.03
JAVA Swing 두개의 판넬을 겹치기  (0) 2013.08.03
JAVA JNI  (0) 2013.05.01