업무)
 차트 데이터를 Excel 파일로 떨궈주길 바라는 요청 (.NET 에서 C# 사용하여 개발)
담당자인 김대리가 C#을 Excel Automation(C++에선 이렇게 부르던데 C#도 이렇게 부르는거 맞나?)을 
통해 무난하게 기능 추가개발

증상)
 오잉? 엑셀 기능을 넣으니 몇몇 PC에서 예외를 Throw 한다는 메시지와 함께 동작하지를 않음

의심)
 첨엔 "설마 C#에선 엑셀관련 기능을 추가해 배포할 때 따로 설치해줘야하는것이 있단말인가?" 하는 말도 안돼는
생각을 잠깐 해봤음...
하지만 MFC에서 해본 경험상 그럴리는 없을텐데... 엑셀만 설치되 있다면 추가적으로 필요한건 없는게 당연한거지
설치된 Excel COM 객체를 사용할텐데... Excel만 설치되있음 문제 없는게 당연한거 아냐?
MS도 그렇게 바보같이 해놨을리는 없구... 

해결과정)
 테스트 PC에서 DbgView와 ::OutputDebugString으로 무식하게 찍어보던중
제대로된 예외문자열을 보게됨
 - 원격 디버그 미숙과 제대로된 디버그 스킬이 없어서...  ㅠ_ㅠ

[7140] ---------- 잡았다 예외!
[7140] System.Reflection.TargetInvocationException: 호출 대상이 예외를 Throw했습니다. ---> System.IO.FileNotFoundException: 파일이나 어셈블리 'Microsoft.Office.Interop.Excel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 지정된 파일을 찾을 수 없습니다.
[7140] 파일 이름: 'Microsoft.Office.Interop.Excel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'
[7140]    위치: nogadaLib.nogada.InitializeComponent()
[7140]    위치: nogadaLib.nogada..ctor()

결론)
 
구글형님께 문의한 결과!
Office 설치시 .NET 프로그래밍 지원을 체크 안하면 요렇게 되는거임...

 Office 를 기본 설치 안하고 사용자지정으로 설치하면 이렇게 될수가 있음
1) 제어판 -> 내 프로그램 추가제거 (윈도우 버전에 따라 알아서) 
2) Microsoft Office ...  변경 -> 기능추가/제거
3) Excel에서 '+' 클릭 -> .NET 프로그래밍 지원 을 "내 컴퓨터에서 실행"으로 변경
4) 변경 대기~~

교훈)
 괜히 고급사용자라고 꼴에 사용자지정 설치를 하면 안될거같아....
그래도 덕분에 하나 알았네~ ㅎ

PS1.
 열심히 원인을 찾아냈지만 사용자에게 일일히 .NET 프로그래밍 지원을 켜라고 할수는 없는
노릇이다라는 반응... 끙...
결국 DLL 에 엑셀 Automation 하는 함수를 추가해서 C# 코드에서 호출하는 방식으로 해결...

 왜 Office에선 그런 옵션을 만들어서... C# 사용자들이 힘들게 하는거지?
뭐 똑똑한 MS놈들이 생각이 다 있어서 했겠지만...

PS2.
 Office에 ".NET 프로그래밍 지원" 을 켜주는 다른 방법은 없는건가?
구찮아서 찾아보지는 않았지만 김대리의 구글검색 결과 찾기가 쉽지는 않은듯함...
알면 좀 갈켜주삼~ 
Posted by 케이피
업무)
마이플랫폼을 통해 저장한 데이터(csv 파일)를 읽어
엑셀 파일로 생성하는 ActiveX 작성 중...

증상)
일부 PC에서 csv 파일은 생성되는데 엑셀 파일이 생성되지 않는
현상 발생했다.

의심)
1. 사용자 권한(UAC)에 관한 문제인가? (개발 PC는 Win7)
 - 권한 문제는 마이플랫폼상에서 돌아가기 때문에 문제 안된다고 알고있었는데...
2. ActiveX 가 제대로 설치되지 않아서 실행이 안된건가?
 - 다른곳엔 다 설치 됐는데 왜?


해결과정)
테스트 PC로 테스트하는중...
저장위치를 C: 루트나 D: 루트를 지정하면 엑셀파일이 생성이 안되네?
바탕화면이나 내 문서에 저장하면 잘된다.
아...
이거 권한 문제가 있나보다...
L소장님께 쪼르르 달려감
 
"권한 문제때문에 일정한 위치에만 저장이되나봐여~"
"그럴리가 있나? XP에서도 안되던데..."
"오잉~"
"왜 C:\\ 이렇게 \가 두개 나오지?"
"아.. C: 루트가 아닐때는 제대로 나오네여"
(C:\어쩌구폴더\)
"아..."

결론)
분명 예전에도 XP에서 안된다고 했던거 같았는데...
내가 너무 권한관련쪽으로만 생각하다보니 기본적인 버그를 알아보지 못했던것...
뭐 서버쪽 프로그래머의 실수이지만... 이걸 못보고 괜한 권한쪽만 고민했다니...
자바쪽에선 C:\\ 두개가 나와도 파일생성에 문제가 없는듯?

교훈)
너무 한가지 생각에만 갇혀서 기본적인 것을 놓치지 말자!

Posted by 케이피
Ctrl + z 는 대체 누가 먹어버리는거야??? y 는 돼는구만...

아... PreTranslateMessage 에서 OnKeyDown 으로 보내서 해결하믄 되는구나....

난 역시 똘추... ㅎㅎㅎ ( -_-)=b
Posted by 케이피

CMemDC 클래스사용해서 메모리 DC를 사용할때... 배경색이 요상하게 나오는경우...
OnEraseBkgnd 를 return FALSE 해줘야한다는걸 이제야 알았다...
난 정말 똘추.... ㅎㅎㅎ
Posted by 케이피
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\WinNT.h
파일의

typedef void *PVOID;
typedef void * POINTER_64 PVOID64;

부분을

typedef void *PVOID;
typedef void *POINTER_64;
typedef POINTER_64 PVOID64;

로 바꿔주면 OK!!!!

끗~
Posted by 케이피

CWinThread

Run 함수가 끝나면 소멸된다...

한마디로 'Thread의 멤버변수로 작업이 끝났는지 판단하는 것'

따위는 절대 해서는 안돼는것이다!!!!

qt ER 짓.... ㅠ.ㅠ

Posted by 케이피

MFC
사용하지 않는 DLL의 LIB를 link 시켜놨을 때

디버그 모드와는 달리 릴리즈 모드에선 경고를 뱉는다.
< LINK : warning LNK4089: all references to "안쓰는DLL.dll" discarded by /OPT:REF >

이 때 무시하고 그냥 릴리즈 모드의 프로그램을 VS에서 실행이 아닌

단독으로 실행 시키면 전혀 관계없는 곳에서 죽을 수도 있다... 진짜 전혀 관계없는곳에서...

(나같은 경우는 PC가 스스로 종료하려 했음... -0-;;;)

얕은 지식덕에 자세한건 모르겠지만... 메모리가 얽키는듯...

이놈의 얕은 지식... 누구 확실히 아는 사람 없나...  ㅠ_ㅠ

무조건 저 경고를 없애야 한다...

릴리즈모드의 Project Setting - Link탭 - Incrementally를 켜면 경고는 안뜨지만...
죽지 않는다고 보장할수없다...

Posted by 케이피
View나 Dlg나 Create 시에 ShowWindow(SW_SHOW) 가 없다면 당연히 화면에 보이지 않아야한다.
그래도 화면에 자꾸보인다면!
Dlg Property를 확인해보자... 어이없게도 More Style탭 Visible에 체크가 돼어있을 수 도있다...
이렇게 돼있으면 코드에는 전혀 ShowWindow가 없지만 생성시 ShowWindow(SW_SHOW) 코드가 있는것마냥 화면에 뜬다...
어흑... ㅠ_ㅠ

<내가 만든 DLL 이 아니라서 너무 기본을 무시해버렸다... 당연히 돼있을줄 알고...>
Posted by 케이피

Preprocessor Definitions (VS6.0 기준)

Win32로 Dll 생성시
WIN32,_DEBUG,_WINDOWS,_MBCS,_USRDLL,WIN32DLL_EXPORTS

MFC로 Dll 생성시 (Regular DLL)
WIN32,_DEBUG,_WINDOWS,_WINDLL,_AFXDLL,_MBCS,_USRDLL


MFC로 Dll 생성시 (MFC Extension DLL)
WIN32,_DEBUG,_WINDOWS,_WINDLL,_AFXDLL,_MBCS,_AFXEXT


Posted by 케이피

A에서곳에서 쓰던 프로젝트<MyProj> 하나를 B로 옮겼다
(드래그N드롭으로...)

mfcs42d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined
   in <MyProj>.obj
mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined
   in <MyProj>.obj

요런 링크 에러가 날 괴롭혀!!!  ㅠ_ㅠ

2틀간의 한심한 삽질중...

Project Setting - C/C++ Tab - Preprocessor Category 의
Preprocessor definitions 내용이... A에서의 내용과 다르다? 뭥미? 젭라~

분명
A에선 WIN32,_DEBUG,_WINDOWS,_WINDLL,_AFXDLL,_MBCS,_AFXEXT 이어던 내용이...
B에선 WIN32,_DEBUG,_WINDOWS,_WINDLL,_AFXEXT,_MBCS,_USRDLL 로 바뀌어있었다...
 헐~ 
헐~
헐~
.
.
헐....
조심하자....  -_-;;;

원인)뭐 결국은 Source의 .dsp 와 Project의 .dsp 가 같을꺼라고 맹신해버린 내가 문제...
하튼 저런 링크에러는 Win32 Dll로 만든거에 MFC라이브러리를 사용하려 했기 때문인듯..
_USRDLL 과 _AFXEXT

Posted by 케이피