C# 2006/12/07 23:29

C#에서 dll을 링크 1

C#으로는 .Net Framwork의 제약때문에 갑갑한 프로그램을 해야 한다. 그래서 지원되지 않는 것은 api를 참조해서 써야 된다.

지난번에 후킹 프로그램을 만들때도 거의 모든것을 api를 사용하여서 만들었는데 또한 전역 후킹 프로그램을 만들려고 한다면 그 후킹 메세지를 dll로 처리 해야 한다. 그런데 그 dll은 또 .Net Framwork에서 만든 dll이 아닌 일반 win32 로 만들어 놓은 dll을 사용하여야 한다.(뭐가 이리 복잡혀??)

그래서 지난번 애먹은것도 있고 해서 한번 해봤다. 잘될지..

먼저 간단하게 두 매개변수의 합을 구하는 dll 함수로 만들어 봤다. vc로 만들어 컴파일을 했다.


extern "C" __declspec(dllexport)int AddInteger(int a,int b)
{
return a+b;
}
 


그리고 이 dll파일을 가지고 솔루션 탐색기의 참조 부분에서 열라게 ^^;; 참조를 해 봤다. 그런데 dll형식이 알수 없다? 는 에러 메세가 나왔다..(이게 웬걸 ㅡ.ㅡ;) 그래서 나는 무슨 다른 방법이 있나?? 고민을 들었다. 일단 소스 코드가 있는 프로젝트 폴더에 dll과 lib파일을 넣어 놓구 컴파일을 해봤다 그런데 이게 왠걸...



User inserted image



에러가 났다...

그래서 에라이 모르겠다. 싶어서 그냥 디버그 폴더에다가 dll 파일과 lib 파일을 같이 집어 넣어 컴파일을 하니 이게 왠걸 실행이 나와 버렸다.



User inserted image





C#코드


위에 결과를 보면 3이라는 결과가 잘 나왔다.

그렇다면 결론은 .Net Framework에서 만들지 아니한놈은 내가 디버그를 하던 릴리즈를 하던 계속 컴파일 한후에 복사하고 붙여 넣기 복사하고 붙여 넣기 이짓 거리를 해야 된다는 얘기인데....... 깔끔한 성격이 나로써는 참을수 없는 결과다. 분명 MS사에서도 나같은 성격자를 위해서 무언가를 해놨을것이다.. 그것을 찾아 봐야 겠다.

쉬울줄 알았다... 제목에서도 나타낸것 처럼 dll을 링크하는데 한참 헤맸다. 그것도 mfc로 따로 만들어준 dll을 링크 하는것 코드 구루에서 코드를 구해서 내가 다시 만들려고 했는데 안됐다. 줸장.. 니 까짓게 뭔데 나를 좌절에 빠지게 하삼???

좌절에 빠지게 한 이 프로그램이 만들어 놓으니 좋은건 좋은거 같다. 어떻게 하루 만에 걸리는지. 정말 바보 같다. 그래도 어째건 프로그램이 동작은 잘 됬다.





소스

유경상씨의 블로그에서 유니 코드 처리하는 것을 봤다. 그래서 그 예제를 보고 현재 입력한 값이 한글 자음인지? 아님 모음인지? 아니면 기타 알파벳인지를 판별하는 프로그램으로 프로그램은 간단한다



C# 2006/11/27 08:34

Dekker Algorithm 5

데커 알고리즘 5번째 것으로 이것은 데커 알고리즘의 문제를 해결하였다.

볼래요

C# 2006/11/27 08:32

Dekker Algorithm 4

데커 알고리즘 4번째 문제로 이 알고리즘에 문제는 일정치 않은 딜레이 함수로 CPU가 쉬게 되고 일정치는 않지만 CPU가 쉴수 있는 문제가 생긴다.

볼래요

C# 2006/11/27 08:29

Dekker Algorithm 3

무한 루프가 걸리게 되는 데커 알고리즘 3이다.

for C#

C# 2006/11/27 08:28

Dekker Algorithm 2

동시에 무한 반복이 걸리는 데커 알고리즘 2번째 것이다.

forC#

C# 2006/11/27 08:26

Dekker Algorithm 1

락스텝이 걸리는 데커 알고리즘 1
락스텝 = 1개의 프로세서가 실행되면 다른 1개의 프로세서도 반드시 실행되어야 된다. 번갈아 가면서

forC#

제가 vfw api를 이용해서 C#에서 캠영상을 출력해 볼려고 하는데

진입점을 찾을수 없다고 하네요..

;

이렇게요.

dllimport는 이렇게 했는데요

;

맨위에 capCreateCaptureWindow는 임포트가 되서 넘어가는데

밑에 capDriverConnect는 저런 메세지가 뜨는데 도움좀 주세요 ^^

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

2003년도에 시현을 위해서 잠깐 셈플링코드로 테스트했던 화상관련 .NET 자료입니다;
(오래되었군요; 덜덜덜;)

당시에 AVICap 을 이용해서도 돌려보고.. DirectX 의 Dnetshow 로도 해본것 같은데..

부하리소스로 보건데 Dnetshow 의 라이브러리가 가장 괜찮았던것으로 기억됩니다.


일단 말씀하신 AVICap 을 이용한 영상처리 및 소스를 첨부합니다.

해당 API는 VB.net 코드로 작성된 클래스코드 라이브러리 입니다.


VB.net 과 C# . 어차피 별반 다를바 없으니 크게 차이가 없을것으로 생각됩니다.

첨부된 클래스를 프로젝트에서 참조하신뒤

picSource 라는 PictureBox 컨트롤 하나 만드신뒤 Form 로드 이벤트시에 화면에 드로잉 하는 소스코드입니다.

(해당 코드는 제작시기를 보시면 아시겠지만, v1.1 의 코드입니다. v2.0 에서도 무리없이 사용하실수 있을것으로 생각됩니다. 다시한번더 try 해보신뒤 의문점있으시면 남겨주시기 바랍니다.)


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Dim lpszName As New Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString(100)
       Dim lpszVer As New Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString(100)
       Dim Caps As AVICAP.CAPDRIVERCAPS


       ''//Create Capture Window
      AVICAP.capGetDriverDescriptionA(0, lpszName.Value, 100, lpszVer.Value, 100) ''// Retrieves driver info


       MemCap.lwndC = AVICAP.capCreateCaptureWindowA(lpszName.Value, MemCap.WS_VISIBLE Or MemCap.WS_CHILD, 0, 0, 320, 240, picSource.Handle.ToInt32, 0)

       ''// Connect the capture window to the driver
       If AVICAP.capDriverConnect(MemCap.lwndC, 0) Then
           AVICAP.capPreviewScale(MemCap.lwndC, True) '' 켑쳐윈도우 크기에 맞게 비율적으로 크게 혹은 작게 preview에 쓰이는 3가지 함수.
           AVICAP.capPreviewRate(MemCap.lwndC, 66) '' 켑처레이트 조절
           AVICAP.capPreview(MemCap.lwndC, True) '' 프리뷰 모드 시작 또는 중지
           ''check = True
           ''capSetCallbackOnFrame(lwndC, AddressOf MyFrameCallback)
       End If

       ''me.picMysmi.p
  End Sub


시샵에서 시스템을 종료 할수 있게 하는 윈 API를 임포트한 파일 입니다.


div>