Audio Wave Form Renderer

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

Audio Wave Form Renderer




Test Harness App


Test Harness UI


Example Waveforms


Basic solid colour waveform Basic solid color

Gradient vertical bars (old SoundCloud style) Gradient vertical bars

Blocks (SoundCloud style) Blocks

Orange Blocks

Transparent Backgrounds Transparent Background

Transparent Background

You can check out all the source code on GitHub





https://markheath.net/post/naudio-png-waveform-rendering

C# Panel DirectShow Video ScrollBar

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

C# Panel DirectShow Video ScrollBar


        public System.Windows.Forms.Panel pnlVideo;



        public QuartzTypeLib.FilgraphManager m_objFilterGraph = null;

        public QuartzTypeLib.IBasicAudio m_objBasicAudio = null;

        public QuartzTypeLib.IVideoWindow m_objVideoWindow = null;

        public QuartzTypeLib.IMediaEvent m_objMediaEvent = null;

        public QuartzTypeLib.IMediaEventEx m_objMediaEventEx = null;

        public QuartzTypeLib.IMediaPosition m_objMediaPosition = null;

        public QuartzTypeLib.IMediaControl m_objMediaControl = null;





         m_objVideoWindow.SetWindowPosition(pnlVideo.ClientRectangle.Left,

                        pnlVideo.ClientRectangle.Top,

                        pnlVideo.ClientRectangle.Height * (int)videoResolutionRate,

                        pnlVideo.ClientRectangle.Height);



m_objVideoWindow shows the video at original rate



1. ScrollBar Padding 20px



                    m_objVideoWindow.SetWindowPosition(pnlVideo.ClientRectangle.Left,

                        pnlVideo.ClientRectangle.Top,

                        (pnlVideo.ClientRectangle.Height - 20) * (int)videoResolutionRate,

                        pnlVideo.ClientRectangle.Height - 20);


2. Size and Scroll Bar Enable



                pnlVideo.HorizontalScroll.Visible = true;

                pnlVideo.AutoScroll = true;

                pnlVideo.MaximumSize = new Size(this.ClientSize.Width, this.ClientSize.Height - 80);

                pnlVideo.AutoScrollMinSize = new Size((int)UserControl1.videoResolutionRate * (this.ClientSize.Height - 80), this.ClientSize.Height - 80);

                pnlVideo.ClientSize = new Size(this.ClientSize.Width, this.ClientSize.Height - 80);

                pnlVideo.Size = new Size(this.ClientSize.Width, this.ClientSize.Height - 80);




참조 dll 강력키 생성 방법

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

참조 dll 이


빌드할 프로젝트는 없고


dll 만 존재 할 경우


다시 강력키로 빌드하는 방법





1. 키파일을 생성한다.


sn -k key.snk


2. MSIL를 얻어온다.


ildasm TEST.dll /out:TEST.il


3.원본 dll backup


xcopy TEST.dll TEST.dll.orig


4. 추출된 MSIL와 key파일을 이용해서 새로운 assembly를 생성한다.


ilasm TEST.il /dll /key= key.snk


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

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


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














5. error CS0214: 포인터와 고정 크기 버퍼는 안전하지 않은 컨텍스트에서만 사용할 수 있습니다.




포인터와 고정 크기 버퍼는 안전하지 않은 컨텍스트에서만 사용할 수 있습니다.

포인터는 안전하지 않은 키워드에만 사용할 수 있습니다. 자세한 내용은 안전하지 않은 코드 및 포인터를 참조하세요.

다음 샘플에서는 CS0214를 생성합니다.




// CS0214.cs  

// compile with: /target:library /unsafe  

public struct S  

{  

   public int a;  

}  


public class MyClass  

{  

   public static void Test()  

   {  

      S s = new S();  

      S * s2 = &s;    // CS0214  

      s2->a = 3;      // CS0214  

      s.a = 0;  

   }  


   // OK  

   unsafe public static void Test2()  

   {  

      S s = new S();  

      S * s2 = &s;  

      s2->a = 3;  

      s.a = 0;  

   }  

}  






unsafe 키워드를 붙여주면 된다.








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

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

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



4. 멤버 함수 가져오기





C++


#ifdef BOX_EXPORTS

#define BOX_API __declspec(dllexport)

#else

#define BOX_API __declspec(dllimport)

#endif






Class BOX_API Box{

public:

Box();

int setInt(int a);

void setString(char* str);

}






int setInt(int a);

void setString(char* str);




이 멤버 함수들을 가져와서 사용하고 싶다.



참고 : http://tansanc.tistory.com/526?category=772232 [TanSanC]





아래와 같이 사용하고 싶지만


불가능하다



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(); ;



            pCBoxClass.setInt(3);

            pCBoxClass.setString("HelloWorld");




            DisposeCBox(pCBoxClass );            




            pCBoxClass = IntPtr.Zero; 


        }

    }

}





            pCBoxClass.setInt(3);

            pCBoxClass.setString("HelloWorld");




클래스 내부 멤버 변수라 바로 가져올 수는 없다.






사용 할 수 있는 방법은


클래스 생성시와 같이


extern 으로 접근가능 하도록 만들어 주어야 한다.











기본 형태





C++






.h


extern "C" BOX_API int setInt(CBox* pObject, int a);






.cpp


extern "C" BOX_API int setInt(CBox* pObject, int a)

{

if (pObject != NULL)

{

pObject->setInt(a);

}

return -1;

}





이렇게 C++ DLL 내부에서 


클래스 객체에 접근하여


객체의 멤버 함수를 호출하여 준다.











void setString(char* str);



는 다음 글에서....






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

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


도움되는 링크들





http://freeprog.tistory.com/220




https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/unsafe



http://heroeskdw.tistory.com/entry/C-MFC-DLL%EC%9D%84-C%EC%97%90%EC%84%9C-%EB%A1%9C%EB%94%A9%ED%95%98%EA%B8%B0


https://www.codeproject.com/Articles/18032/How-to-Marshal-a-C-Class




http://www.sysnet.pe.kr/2/0/11132







http://www.sysnet.pe.kr/2/0/11111







https://msdn.microsoft.com/ko-kr/library/62688esh.aspx












https://social.msdn.microsoft.com/Forums/en-US/b85fc9dd-acc5-42dc-a28e-b70953bf1170/unhandled-exception-systemruntimeinteropservicessehexception-additional-information-external?forum=vcgeneral

















https://msdn.microsoft.com/ko-kr/library/system.io.filestream.read(v=vs.110).aspx







http://storycompiler.tistory.com/214






























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

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

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



2. DLL 참조하기




C++ DLL 을 C# 에서 사용하려면


일단 참조를 하여야 한다.




참조를 하는 방법은




Visual Studio 2013 버전에서는






[솔루션 탐색기] -> [솔루션] 하위 -> [프로젝트] 하위 -> [참조] -> 우클릭 -> [참조 추가] -> 우측 하단 [찾아보기(B)...] -> 원하는 DLL 찾아서 선택



선택을 하면 [참조] 하단에 참조된 DLL 이 보이게 된다.










여기서.......



이 글은


참조된 DLL 을 더블클릭하여 [개체 브라우저]로 보았을때도


하위 멤버들이 보이지 않는


C++ DLL 일 경우 해결하는 방법들을


순서...에 상관없이


메모해 두려고 한다.









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 의


클래스가


만들어진다.





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










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

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

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



1. DllImport






DLL Import 시






        [DllImport("CPPDLL.dll"] ,  


         혹은 


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



         쓰는 것을 볼 수 있다.






C#의 DllImport 특성은 기본 CallingConvention이 StdCall로 되어 있습니다.









DllImportAttribute Class

; https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute(v=vs.110).aspx


DllImportAttribute.CallingConvention Field

; https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.callingconvention(v=vs.110).aspx












일반적인 코드는 __cdecl, __stdcall에 상관없이 C#에서는 명시적인 CallingConvention 없이도 잘 실행됩니다.












하지만 .Net 4.0 이상의 빌드 환경에서는 


명시적인 CallingConvention 이 필요할 수 있습니다.


















.Net 4.0 이상에서는


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


이 방법으로 사용하는 것을 추천합니다.


































참고 : http://www.sysnet.pe.kr/2/0/11132 [C# 개발자를 위한 Win32 DLL export 함수의 호출 규약 (1) - x86 환경에서의 __cdecl, __stdcall에 대한 Name mangling]






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

using System.Diagnostics;



Stopwatch sw = new Stopwatch();


sw.Start();





// TODO






sw.Stop();






MessageBox.Show(sw.ElapsedMilliseconds.ToString() + "ms");



MessageBox.Show(sw.Elapsed.Hour.ToString() + "Minute");

MessageBox.Show(sw.Elapsed.Minute.ToString() + "Minute");

MessageBox.Show(sw.Elapsed.Second.ToString() + "Minute");