블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2855)
Unity3D (895)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (191)
협업 (64)
3DS Max (3)
Game (12)
Utility (142)
Etc (99)
Link (34)
Portfolio (19)
Subject (90)
iOS,OSX (53)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (19)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

Introduction

This class allows you to tap keyboard and mouse and/or to detect their activity even when an application runs in the background or does not have any user interface at all. This class raises common .NET events withKeyEventArgs and MouseEventArgs, so you can easily retrieve any information you need.

Background

There are a number of applications that run in the background and detect user inactivity to change their mode. For example, MSN Messenger (or any other messenger). I was going to write such an application, so I searched MSDN and found "exactly" what I needed: 318804 - HOW TO: Set a Windows Hook in Visual C# .NET. This article describes how to tap the mouse movement, but it works only when an application is active. At the end of this article, I found this explanation: "Global hook is not supported in .NET Framework. You cannot implement global hooks in Microsoft .NET Framework...". Anyway, I continued my research and found out that there are exceptions. There are WH_KEYBOARD_LL and WH_MOUSE_LL hooks that can be installed globally. So, I have basically replaced WH_MOUSE with WH_MOUSE_LL in the MSDN example, and it works.

The second step was to extract the information received into a .NET EventArgs and raise the appropriate events.

I found a similar article in CodeProject, under Global System Hooks in .NET by Michael Kennedy, but what I dislike is, there is an unmanaged DLL in C++ that is a main part of this solution. This unmanaged DLL is in C++, and a number of classes make it complicated to integrate it in my own tiny application.

Revisions

This article was posted in 2004 and updated in 2006. During all this time until now I receive a lot of positive feedback and recommendations. There were also a number of technology improvements like .NET Framework 3.5 or Visual Studio 2008. So I have decided to update it once more.

I have refactored and improved the solution, made it more flexible, stable and efficient. But this refactoring also had some drawbacks:

  1. Number of code lines and files has grown.
  2. Backward compatibility to older .NETs is lost.

That's why I attend to leave the old version also to be available for download.

Using the Code [Version 2]

The Simple Way

If you are developing a Windows Forms application and prefer drag & drop programming, there is a componentnamed GlobalEventProvider inside the assembly Gma.UserActivityMonitor.dll. Just drag and drop it to your form and create events using the property editor events tab.

The Alternative Way

Use events provided by the static class HookManager. Note that the sender object in events is alwaysnull.

For more usage hints, see the source code of the attached demo application.

Using the Code [Version 1]

To use this class in your application, you need to just create an instance of it and hang on events you would like to process. Hooks are automatically installed when the object is created, but you can stop and start listening using appropriate public methods.

 Collapse
UserActivityHook actHook;
void MainFormLoad(object sender, System.EventArgs e)
{
    actHook= new UserActivityHook(); // crate an instance

    // hang on events

    actHook.OnMouseActivity+=new MouseEventHandler(MouseMoved);
    actHook.KeyDown+=new KeyEventHandler(MyKeyDown);
    actHook.KeyPress+=new KeyPressEventHandler(MyKeyPress);
    actHook.KeyUp+=new KeyEventHandler(MyKeyUp);
}

Now, an example of how to process an event:

 Collapse
public void MouseMoved(object sender, MouseEventArgs e)
{
    labelMousePosition.Text=String.Format("x={0}  y={1}", e.X, e.Y);
    if (e.Clicks>0) LogWrite("MouseButton     - " + e.Button.ToString());
}

Changes and Updates from [Version 0] to [Version 1]

I'd like to thank you all for all the useful comments in the discussion forum. There were a lot of bugs and proposals posted after this article was published on 4th June, 2004. Over and over again came the same topics, and I had to refer to previous posts in the discussion, that is why I have decided to revise the code and publish a FAQ. Here is the list of the most important changes:

  • The project was converted into Visual Studio 2005
  • The problem with upper case characters is solved
  • Mouse wheel information is now included in event arguments
  • Better exception handling
  • Cancellation of keyboard events using the Handled property of event arguments
  • XML documentation of functions

FAQ [Version 1]

Question

The project cannot be run in Visual Studio .NET 2005 in debug mode because of an exception error caused by calling the SetWindowsHookEx. Why? Is it a problem of .NET 2.0?

Answer

The compiled release version works well so that cannot be a .NET 2.0 problem. To workaround, you just need to uncheck the check box in the project properties that says: "Enable Visual Studio hosting process". In the menu: Project -> Project Properties... -> Debug -> Enable the Visual Studio hosting process.

Question

I need to suppress some keystrokes after I have processed them.

Answer

Just set the e.Handled property to true in the key events you have processed. It prevents the keystrokes being processed by other applications.

Question:

Is it possible to convert your global hooks to application hooks which capture keystrokes and mouse movements only within the application?

Answer

Yes. Just use...

 Collapse
private const int WH_MOUSE = 7;
private const int WH_KEYBOARD = 2;

... everywhere, instead of:

 Collapse
private const int WH_MOUSE_LL = 14;
private const int WH_KEYBOARD_LL = 13;

Question

Does it work on Win98 (Windows ME, Windows 95)?

Answer

Yes and No. The global hooks WH_MOUSE_LL and WH_KEYBOARD_LL can be monitored only under Windows NT/2000/XP. In other cases, you can only use application hooks (WH_MOUSE and WH_KEYBOARD) which capture keystrokes and mouse movement only within the application.

Question

I have a long delay when closing applications using hooks by clicking the x button in the titlebar. If I close the application via another event (button click) for example, that works fine.

Answer

It's a known bug of Microsoft. It has to do with the Windows themes. If you disable the Windows themes, the problem goes away. Another choice is to have the hook code run in a secondary thread.

Question

How do I catch key combinations like Ctrl+Shift+A?

Answer

You'll have to track which keys have gone down but not up. Only the most recently pressed key keeps sendingKeyDown messages, but the others will still send a KeyUp when released. So if you make three flagsIsCtrlDown, IsShiftDown, and IsADown, and set them to true at KeyDown and false at KeyUp, the expression (IsCtrlDown && IsShiftDown && IsADown) will give you the required result.

Question

Does it works with .NET Framework 1.1 and Visual Studio 2003?

Answer

Yes. The file UserActivityHook.cs can be used without any changes, in a Visual Studio 2003 .NET 1.1 project.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

George Mamaladze

Software Developer (Senior)

Germany Germany

Member


출처 : http://www.codeproject.com/KB/cs/globalhook.aspx
반응형

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

[펌] 입력 문자 검사  (0) 2011.09.14
C# 관련 정보 사이트[MKEXDEV.NET]  (0) 2011.09.13
Array -> String  (0) 2011.05.09
SaveFileDialog  (0) 2011.03.25
DataGridView to XML  (0) 2011.03.23
Posted by blueasa
, |

Array -> String

Programming/C# / 2011. 5. 9. 02:12

요새 c#으로 삽질중이다.

 

오늘은 배열로 한 한시간 가까이 날려 먹은거 같은데;;

 

Array라는 타입이 있다. 모든 배열의 기초 클래스란다

요넘을 String[]로 옮기고 싶은 거다...

 

즉...

Array Buffer = new Array[0];

이런 녀석이 있다면

String[] szBuffer = Buffer;

이 짓을 하고 싶다는 거지;;

 

한참을 해맸지만 결론은 간단했다.

 

String[] szBuffer = (String)Buffer;

 

허탈하네 - _-;;



[출처]
 C#에서 배열|작성자 시네루진

반응형

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

C# 관련 정보 사이트[MKEXDEV.NET]  (0) 2011.09.13
Processing Global Mouse and Keyboard Hooks in C#  (0) 2011.05.13
SaveFileDialog  (0) 2011.03.25
DataGridView to XML  (0) 2011.03.23
ToolTip 사용하기  (0) 2011.02.11
Posted by blueasa
, |

메모리 릭 잡기

Tip & Tech / 2011. 5. 9. 02:09

//_CrtSetBreakAlloc( 11698 );
 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_DELAY_FREE_MEM_DF );

 

간단하다. 이거 맨위에 추가해 주자

 

만약 라인수가 나온다면, 주석 처리 된 부분의 숫자를 그 라인으로 바꿔준다.

 

그리고 다시 실행하면 해당 부분에서 브레이크가 걸린다.

 

간단한 건데, 자꾸 까먹어서 메모해 둔다



[출처]
 메모리 릭 잡기|작성자 시네루진

반응형
Posted by blueasa
, |

유도탄

Programming/Algorithm / 2011. 5. 4. 15:33
반응형

'Programming > Algorithm' 카테고리의 다른 글

lock free 알고리즘들...  (0) 2012.05.11
알고리즘의 설계  (0) 2010.04.14
Posted by blueasa
, |
와우 접속유지 프로그램 입니다.

Upkeep Of W.O.W 줄여서  U.O.W라고 해놨어요 =ㅅ=

아는 사람이 만들어 달래서 C# 배운김에 C#으로 아주 단순하게 만들어 봤어요 =ㅅ=

P.s. 소스(별로 볼건 없지만..;;) 포함해서 올립니다.
VS2005(FrameWork 2.0)로 만들었습니다.
실행파일이랑 소스랑 포함해서 압축해놨어요. =ㅅ=;; 


반응형

'잉여 프로젝트' 카테고리의 다른 글

Diablo III AutoLogin (ver 0.0.2)  (2) 2012.05.22
Posted by blueasa
, |

디버거로 프로그램 실행 도중 변수 값 조정 방법

 

작성자 : 최흥배 ( jacking75@gmail.com )
 

이 기법은 Game Coding Complete ”라는 책에서 디버깅 기법 중 하나로 소개되고 있는 기법으로 프로그램을 디버깅 모드로 실행하면서 어떤 변수의 값을 변경하 여그 결과를 바로 알고 싶을 때 아주 좋다.

일반적으로 UI 작업 같은 것을 해보면 컨트롤 등의 위치를 바르게 잡기 위해 위치 값을 변경하면서 컴파일->실행->수정->컴파일 단계를 반복하면서 정확한 값을 알아내기 때문에 상당한 시간과 짜증이 유발 된다.

이외에 데이터 주도방식으로 프로그래밍 해도 되지만 이것도 데이터변경->실행 단계를 계속 반복 해야 되기 때문에 UI 노가다 작업이 만만치 않을 것이다.

그러나 지금 소개하는 기법을 사용하면 아주 손쉽고 바로 그 결과를 알 수 있다.


 

이 기법을 사용 하려면 static 변수를 사용하여 디버깅 시 static 변수를 사용하는 부분에 브레이크 포인트를 걸고 변수를 조정하면 된다.



위의 그림을 보면 static 변수 nn0에 값을 설정 한 후 이 값을 사용하는 280 라인에 브레이크 포인트를 걸어 놓는다.

그런 후 디버깅 시에 280 라인에서 프로그램이 멈추면 디버깅 창의 “자동(Watch) ”창에서 nn0 변수를 찾은 후 값을 원하는 값으로 변경한다.




nn0의 값은 원래는 53 이었으나 이제 60으로 변경 되어 이후 60으로 설정 되어 프로그램에서 사용된다.


 

위 그림의 코드를 보면 알겠지만 위 코드는 화면에 글자를 찍기 위한 코드인데 화면에서 글자를 찍을 때 위치에 맞게 하기 위해서 x,y 좌표를 변경하면서 결과를 바로 보기 때문에 아주 빠르고 쉽게 작업이 된다.

출처 : 
http://jacking.tistory.com/301

 

반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |

말잘하는 50가지 비결

Etc / 2011. 4. 24. 05:27

 말 잘 하는 50가지 비결
- 이상헌 (산업교수.칼럼니스트,기쁨세상PD)



사람은 태어나서 죽을 때까지 18.gif 계속 말을 하는데 어떤 학자의 연구에

따르면 한 사람이 평생
5백만 마디의 말을 한다는 것이다.


말 한마디로 천 냥 빚을 갚는다는 말을 돈으로 계산하면(금 한 냥 곱하기 1000)

말 한마디가
6억 원이 되고 이것을 다시 5백만으로 곱하면 3천조 원이란 천문학적인

계산이 나온다.


원석도 갈고 다듬으면 보석이 되듯 말고 갈고 닦고 다듬으면 보석처럼

빛나는 예술이 된다.



1. 같은 말이라도 때와 장소를 가려서 해라. 그 곳에서는 히트곡이

여기서는 소음이 된다.
2. 이왕이면 다홍치마다. 말에도 온도가 있으니 썰렁한 말 대신18.gif 화끈한

말을 써라.


3. 내가 하고 싶은 말에 열올리지 말고 그가 듣고 싶어하는 말을 하라.

나 이외에는 모두가 우수고객이다.



4. 입에서 나오는대로 말하지말라. 체로 거르듯 곱게 말해도 불량율은

생기게 마련이다.
5. 상대방을 보며 말하라. 눈이 맞아야 마음도 맞게 된다.
6. 풍부한 예화를 들어가며 말하라. 예화는 말의 맛을 내는 훌륭한 천연 조미료이다.



7. 한 번 한 말을 두번 다시 하지를 말라. 듣는 사람을 지겹게 하려면 그렇게 하라.
8. 일관성있게 말하라. 믿음을 잃으면 진실도 거짓이 되어 버린다.
9. 말을 독점 말고 상대방에게도 기회를 주어라. 대화는 일방통행이 아니라

쌍방교류다.



10. 상대방의 말을 끝까지 들어줘라. 말을 자꾸 가로채면 돈 빼앗긴 것보다

더 기분 나쁘다.
11. 내 생각만 옳다고 생각하면 큰 오산이다. 상대방의 의견도 옳다고 받아들여라.
12. 죽는 소리를 하지 말라. 죽는 소리를 하면 천하장사도 살아 남지 못한다.



13. 상대방이 말할 때는 열심히 경청하라. 지방방송은 자신의 무식함을

나타내는 신호다.
14. 불평불만을 입에서 꺼내지 말라. 불평불만은 불운의 동업자다.
15. 재판관이 아니라면 시시비비를 가리려 말라. 옳고 그름은 시간이 판결한다.



16. 눈은 입보다 더 많은 말을 한다. 입으로만 말하지 말고 표정으로도 말을 하라.
17. 조리있게 말하라. 전개가 잘못되면 동쪽이 서쪽된다.
18. 결코 남을 비판하지 말라. 남을 감싸주는 것이 덕망있는 사람의 태도다.



19. 편집하며 말하라. 분위기에 맞게 넣고 빼면 차원높은 예술이 된다.
20. 미운 사람에게는 각별히 대하여라. 각별하게 대해주면 적군도 아군이 된다.
21. 남을 비판하지 말라. 남을 향해 쏘아올린 화살이 자신의 가슴에 명중된다.



22. 재미있게 말하라. 사람들이 돈내고 극장가는 것도 재미가 있기 때문이다.
23. 누구에게나 선한 말로 기분좋게 해주어라. 그래야 좋은 기의 파장이

주위를 둘러싼다.
24. 상대방이 싫어하는 말을 하지 말라. 듣고 싶어하는 얘기하기에도 바쁜 세상이다.



25. 말에도 맛이 있다. 입맛 떨어지는 말을 하지 말고 감칠 맛나는 말을 하라.
26. 또박또박 알아듣도록 말하라. 속으로 웅얼거리면 염불하는지 욕하는지

남들은 모른다.
27. 뒤에서 험담하는 사람과는 가까이 말라. 모진 놈 옆에 있다가 벼락맞는다.



28. 올바른 생각을 많이 하라. 올바를 생각을 많이 하면 올바른 말이 나오게 된다.
29. 부정적인 말은 하지도 듣지도 전하지도 말라. 부정적인 말은 부정타는 말이다.
30. 모르면 이해될 때까지 열번이라도 물어라. 묻는 것은 결례가 아니다.



31. 밝은 음색을 만들어 말하라. 듣기좋은 소리는 음악처럼 아름답게 느껴진다.
32. 상대방을 높여서 말하라. 말의 예절은 몸으로 하는 예절보다 윗자리에 있다.
33. 칭찬 감사 사랑의 말을 많이 사용하라. 그렇게 하면 사람이 따른다.



34. 공통화제를 선택하라. 화제가 잘못되면 남의 다리를 긁는 셈이 된다.
35. 입에서 나오는대로 말하는 사람은 경솔한 사람이다. 가슴에서 우러나오는

말을 하라.
36. 대상에 맞는 말을 하라. 사람마다 좋아하는 음식이 다르듯 좋아하는 말도

다르게 마련이다.



37. 말로 입은 상처는 평생 간다. 말에는 지우개가 없으니 조심해서 말하라.
39. 품위있는 말을 사용하라. 자신이 하는 말은 자신의 인격을 나타낸다.
40. 자만 교만 거만은 적을 만드는 언어다. 자신을 낮춰 겸손하게 말하라.



41. 기어들어가는 소리로 말하지 말라. 그것은 임종할 때 쓰는 말이다.
42. 표정을 지으며 온 몸으로 말하라. 드라마 이상의 효과가 나타난다.
43. 활기있게 말하라. 생동감은 상대방을 감동시키는 원동력이다.



44. 솔직하게 말하고 진실하게 행하라. 그것이 승리자의 길이다.
45. 말에는 언제나 책임이 따른다. 책임질 수 없는 말은 하지말라.
46. 실언이 나쁜 것이 아니라 변명이 나쁘다. 실언을 했을 때는 곧바로 사과하라.



47. 말에는 메아리의 효과가 있다. 자신이 한말이 자신에게 가장 큰 영향을 미친다.
48. 말이 씨가 된다 어떤 씨앗을 뿌리고 있는가를 먼저 생각하라.
49. 말하는 방법을 전문가에게 배워라. 스스로는 잘하는지 못하는지 판단하지

못한다.



50. 적게 말하고 많이 들어라. 그래야 넉넉한 18.gif 사람이 된다.

반응형
Posted by blueasa
, |
Tortoise SVN Client 에서 아이디 비밀번호를 변경하고 싶은데요.. 

안녕하세요.

Tortoise SVN Client 을 사용하다 궁금한 점이 있어서 질문하게 되었습니다.

얼마전에 SVN Server 에서 담당자분이 아이디랑 패스를 지워버려서 새로운

아이디랑 패스워드를 발급 받았습니다.

근데 SVN Client 에서 바뀐 아이디랑 패스로 변경하고 싶은데 도대체 어디서 바꿔야

할지 통 모르겠습니다.

셋팅 메뉴에 보면 정보를 Clear 하는게 있던데 그걸 해야 되는건가요?

지금 사용중인 서버라서 괜찮을지 궁금합니다.

고수님들 알려주세요.

    
Tag  
tag는 게시물의 성격을 나타내는 키워드를 입력하는 공간입니다. 
tag는 로그인 후 사용하실 수 있습니다.
  • 제가 쓰는게 일본어판이라 확실하진 않습니다만... 
    오른쪽 버튼 클릭 - 설정 - (메뉴중에서)보존데이터 누르시면 오른쪽에 
    인증데이터 클리어 버튼이 있을겁니다. 
    그거 누르시고 다시 서버에 접속하려 하면 비번이랑 아이디 물어볼꺼에요.



출처 :  
http://www.okjsp.pe.kr/seq/130437
반응형

'Tip & Tech' 카테고리의 다른 글

메모리 릭 잡기  (0) 2011.05.09
디버거로 프로그램 실행 도중 변수 값 조정 방법  (0) 2011.04.29
DLL 사용한다면 참고하세요  (0) 2011.04.19
미들웨어 정리  (0) 2011.04.13
타격감 향상을 위한 방법론  (0) 2011.03.17
Posted by blueasa
, |
DLL을 사용한다면 참고하시라고 몇자 적어봅니다.

 아미 몇번 DLL을 써 보셧다면 다 아시는 내용일겁니다.

 1.  한 프로그램에 쓰인 클래스를 다른 프로그램에서도 같이 써야 할 일이 생겨서, 그냥 소스만 복사해넣고 좀 고쳐서 놓고 쓰니 불편하더군요.. 그래서 DLL 형태로 공유하는 엔진을 만들어서 Static 링크를 시도했읍니다.

  이때 DLL 만들때 제일 먼저할 것은 DLL 생성한 후에  프리컴파일 디파인 에 _AFXEXT 와 _NOWCOMPILE 을 넣어주는 것입니다.  _NOWCOMPLIE 이란 항목은 나중에 컴파일을 위한 옵션입니다.
 
     Project -> Setting ->  C/C++  에서  추가해 줌..

  다음 클래스 이름을 외부에서 호출할 수 있도록

 class AFX_EXT_CLASS  myClass { ...}  로만 선언하고

 헤더파일에 

#if !defined(_NOWCOMPILE)
#if defined(_DEBUG)
    #pragma comment(lib, "..\\myDLL\\debug\\myDLL.lib")
#else
    #pragma comment(lib, "..\\myDLL\\release\\myDLLD.lib")
#endif
#endif

 
 _NOWCOMPLE 옵션은  헤더파일 포함시 LIB가 같이 포함되도록 하는 용도의 플래그 입니다.
 DLL 컴파일시에만 포함되지 않도록 하기 위해서 DLL 프로젝트에만 _NOWCOMPILE를 추가하는 것이죠.

 
 2. 릴리즈 와 디버그 DLL 버전 관리..
 릴리즈와 디버그 버전을 관리하고자 한다면,   제일 먼저 할 일은  .def 파일을 두개로 만들어서 그중 하나에서 디버그용 이름으로 변경해 놓는 것입니다.  제 경우 D를 추가해 놓죠.
 
    Project -> Setting ->  Link  에서 def  이름 지정된 것을 변경해 줍니다.
 
 이 작업이 빠지면, 디버그 와 릴리즈 버전 이름이 같아서 혼동이 생기게 됩니다.


 3. 버전에 따른 리소스를 다르게?

  버전에 따라서 리소스의 버전을 다르게 만들고 싶어질 경우가 있읍니다.
  좀 귀찮아서 써 봤는데.. 
  이경우    Project -> Setting ->  Resource 에서  프리컴파일 디파인을 지정해 줄 수 있읍니다.
  그러면 RC 파일을 편집해서  조건을 지정할 수 있지만, 여기에 가장 큰 문제는
  리소스 에디터에서 변경을 하게되면 조건 걸린 부분이 날라갑니다.
 결국 별도 파일로 만들어서 #include 시켜서 써야 했죠.
 제경우 bmp 이미지를 몇개를 버전에 따라서 다르게 보이도록 하기 위해서 설정한 것입니다.


 4.  다이나믹 DLL  사용

 먼저 DLL을 만들고, DLL에서 사용하는 함수를 호출 할 수 있도록 선언합니다.
 
extern "C" __declspec( dllexport ) void  InitPage(CString arg1,CString arg2)
{
   CMyDlg dlg;
   dlg.DoModal();
}

  CMyDlg dlg 라는 것이 DLL 내부에 만들어진 다이알로그 입니다.
 

 DLL 의 InitPage 를 호출하는 부분

void CallDll()
{
HINSTANCE hInst,oInst;
#ifdef _DEBUG
    hInst=AfxLoadLibrary("myDLLD.dll"); // 디버그 버전
#else
    hInst=AfxLoadLibrary("myDLL.dll"); //릴리즈 버전
#endif
    if (!hInst)
    {
        AfxMessageBox("DLL Load 에러!");
        return;
    }
    typedef void ( * INITPAGE)(CString,CString);
    INITPAGE func;
        func=(INITPAGE)GetProcAddress(hInst,"InitPage");
    if (func)
    {
        oInst=AfxGetResourceHandle();
        AfxSetResourceHandle(hInst);
        func("테스트","테스트1");
        AfxSetResourceHandle(oInst);
    }
    AfxFreeLibrary(hInst);
 
}

 이렇게 사용하면 됩니다.
 여기서 리소스 핸드를 바꿔주고 복구하는 것이죠
 여기서 중요한 포인트는     typedef void ( * INITPAGE)(CString,CString); 입니다.
 DLL 과 함수 선언이 동일해야 합니다. 저의 실수는 처음에 만들때     typedef bool  ( * INITPAGE)(CString,CString); 로 해 놓고 컴파일하니 이상없이 동작 잘 하더군요,  DEBUG 버전에서 릴리즈 버전으로 바꾸어서 테스트 하니  스택에 오류가 생기더군요.. 무엇이 원인인가.. DLL 함수 선언이 문제인가 하고 이것 저것 고민하면서 테스트 했는데,  결론은 DLL 의 평션에서는  void 였는데,  콜할때 선언은 BOOL 로 해서 ,   릴리즈 버전에서 스택에서 리턴값을 클리어하느라 에러가 났던 것입니다.
  반듯이  DLL 과 사용하는 함수의 선언은 리턴값까지 일치 시켜야 합니다.  파라미터에 신경쓰다가 실수한 부분입니다.

 
 5. 다이나믹 DLL 의 해제 시점..

  DLL의 함수에서 메모리 할당을 받았다면,  DLL 의 해제 시점(AfxFreeLibrary 호출 시점)은   메모리 해제한 이후에 해야 합니다.
  무슨 소리냐면, DLL 함수에 구조체를 보내서, DLL에서  구조체의 데이타를 Free 시키고, 새로 할당해서 데이타를 채워서 리턴시키는데,  이것을 Free 하는 시점에서 계속  힙이 깨졌다는 오류가 나오더군요.
 원인 파악을 하기 위해서 6시간정도 고생을 했는데, 결국 DLL 해제 시점을 옮김으로서 해결되더군요.
 만약 DLL 에서 뭔가를 가져왔다면,  반납하기 전에는 DLL을 해제하지 마세요..
 시스템 크래시와 부딪힐 수 있읍니다.


 

 이상입니다.
 과연 몇분에게나 도움이 될런지.....

ps:
 쓰레드간 통신에서  SendMessage 를 가지고 동기화를 하게 되는 경우,  데드락 걸릴 수 있는 여지가 있읍니다.
 그걸 해결하는 방법은 SendMessageTimeout 이란 평션을 사용하면 어느정도 해결됩니다.
 단 메세지 전송되는 핸들이 서로다른 쓰레드일 경우에만 효과가 있다고 하더군요.
 여기 Q/A 에 있는 정보 입니다.


출처 : 
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=4722&ref=1602
반응형
Posted by blueasa
, |