상황은 AFX DLL 을 사용하는 EXE에서 문자열을 리턴받고 싶을 때 이다.

Want :
// EXE에서 이런 형태로 사용하고 싶었다.
CString str = myDllClass.ToString();
//or... 좀 번거롭지만 이렇게라도 굳이 쓰고 싶었다.
CString str;
myDllClass.ToString(str);

So I Was : (Wrong)
CString ToString()
{
    return _T("merong~");
}
// and
void ToString(CString& str)
{
    str = _T("merong~");
}


이렇게도 해봤는데

릴리즈모드로 빌드한 EXE를 실행시 에러가 나지 않지만 디버그모드로 빌드한 EXE에서는
 
Error on Excute :
dbgheap.c
Line: 1044
Expression : _CrtlsValidHeapPointer(pUserData)
...

뭐 이런 에러가 나더라

찾아보니까 빌드시 DLL 의 CString 과 EXE의 CString 이 다르기 때문(자세한건 에러로 구글링해보면 나온다.) 이라는 결론이 나왔다.

곧 죽어도 CString 을 LPSTR로 변환시켜서 쓰고 싶진 않았던 터라 (그러기 싫어서 굳이 CString 따위를 사용했다)
const 도 여기저기 붙여보는 뻘짓을 했다.

CString 은 묵시적으로 LPCTSTR 로 변환이 가능하지?

그럼 굳이 const 인 LPCTSTR 을 LPSTR로 변환하지 않고도 사용할 수 있는건데...

결국 결론은 간단했다.

Right :
// AFX DLL 에서의 선언:
LPCTSTR ToString() {
    return _T("merong~");
}

// EXE 에서의 사용
CString str = myDllClass.ToString();



만세.

이걸 해결 못해서 하루 종일 낑낑댄 나는.... OTL

오늘의 교훈.
절대로 CString 을 써야만 하는 상황이 아니면 이따위것 쓰지 말자.
Posted by freezn
#pragma warning(disable:4503 4786)
숫자는 warning코드..

STL 쓰려니 무한 warning의 압박이 다가온다

...제길 OTL


이런것도 모르는 무지한 후배에게 알려주신 곽**선배 감사 ㅎㅎㅎ
Posted by freezn
삽질기행/잡다정보2006. 12. 21. 03:23
Edward C. Bailey, "Maximum RPM" :
RPM을 다룬 문서(책) 중 가장 상세함... 하지만 좀 오래됨...
http://www.redhat.com/docs/books/max-rpm/max-rpm-html/index.html
http://www.rpm.org/max-rpm/

Eric Foster-Johnson, "RPM Guide" :
좀더 쉽게 쓰여진 편이고 예제도 풍부함
Python-RPM 모듈을 사용할 때도 좋음...
http://fedora.redhat.com/docs/drafts/rpm-guide-en/

Paul Nasrat, "RPM Python(and friends)" :
Python-RPM 모듈과 펄등에서의 활용을 다룬 문서
http://people.redhat.com/pnasrat/rpm-python/rpm-python-slides/frames.html
Posted by freezn
yum으로 다음의 패키지를 설치한다.

nautilus-open-terminal


정보 출처 : http://linux.rasmil.dk/cms/modules/dokuwiki/doku.php?id=howto:fc5
Posted by freezn
CPU : P4 2.4B
M/B : GIGABYTE 8GEM667 (i845GE)
Graphic card : Sapphire RADEON 9100 (64MB)
RAM : SEC 256*2

ATI...
예전부터 리눅스용 드라이버 지원이 좋지만은 않다는걸 알고는 있었지만 퀘이크3가 계속 땡기는 참에 ㅠ_ㅠ

(DVI출력도 안되니 듀얼도 못쓰고...)

fglrx를 설치해보려했건만 ...

왜 안되는겨 ;ㅁ;

시냅틱에서 받아서 설치도 해보고 ATI에서 다운받은 바이너리로도 해보고 컴파일해서 모듈로도 올려봤지만 매번 부팅후 처음엔 화면이 나오다가 몇분 지나거나 불여우를 켜는 순간 그야말로 뻗어버린다.


xorg.conf에 그래픽카드 섹션
Section "Device"
Identifier "ATI Technologies, Inc. Radeon 9100 (R200 QM)"
Driver "ati"
BusID "PCI:1:0:0"
Option "UseInternalAGPGART" "no"
Option "VideoOverlay" "on"
Option "OpenGLOverlay" "off"
EndSection


아래쪽 3가지 옵션들은 충돌이 있을 수 있는 부분들이라던가... 누군가 의 블로그 내용에서 퍼온것이지만 가장 관건은 결국 드라이버를 fglrx로 올리면 같은 현상이다.

모바일라데온9600인 선배 노트북은 잘되던데... 그래픽카드를 새로 사야하나 -_-;;

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

ATI홈페이지에 8.18.8 버전이 릴리즈 됐길래 설치해보니 다운도 안되고 잘된다....

고 좋아했더니 어째 속도가 느리다.

음... 설마... 하면서 fglrxinfo 해보니

...mesa 3d (...)

결론은 처음부터 다시 ㅡㅡ;

뭐... 3D를 제대로 못돌리는건 아쉽지만 일단 DVI 출력이 잘되니 그냥 쓰기로 ㅡㅡ;;

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

8.26.18 버전이 나왔길래 또 해봤다.
나머지는 사양은 똑같고 그래픽카드만 유니텍 RADEON 9000 128MB 으로 바꿨다.
(연수생 할 때 옆에 계시던 분이 버리려는 거 주섬주섬 받아왔다...;;)

그냥 다음 다음 눌러 설치하고 aticonfig --initial 해버리니

오... 잘 잡힌다. (바꾼 다음에도 기존버전은 잘 잡히지 않았었다.)


결론. Radeon 9100 은 까다롭다 - _-;;

Posted by freezn
삽질기행/잡다정보2006. 10. 18. 23:45
주 :
- 레드헷 8.0 이후 rpm 에 build관련 옵션이 사라졌다고 한다. (rpmbuild로 나뉘었다.)
- fedora core4에 기본으로 준비된 패키징용 디렉토리는 /usr/src/redhat 이었다 =_=
- 부요는 /usr/src/booyo에 있다.
- 빌드디렉토리에는 BUILD, RPMS, SOURCES, SPECS, SRPMS이 있어야 할듯하다.


Source RPM 을 재 패키징하려는 경우 :
그냥 막연히 src.rpm이니 rpm -Uvh xxx.src.rpm을 해줬더니 진짜 설치가 되더라. -_-;
/usr/src/redhat에서.
SOURCE에는 tarball소스와 적용된 패치, 추가로 필요한 파일들이 들어가있다.
SPECS에는 .spec로 끝나는 rpm설정(?)파일이 들어가 있다.
tar.gz같은 소스가 rpm으로 바뀌는데 가장 중요한 녀석이라고 생각한다.
----------
새로운 RPM을 만들어내려는 경우 :
SPEC파일을 직접 만들어야한다.
이에 대한 내용은 KLDP의 RPM_Guide 를 참고하면 된다.
아니면 다른 spec파일(src.rpm에 포함된)을 참고해도 좋다.

SOURCES디렉토리에는 프로그램의 소스인 tar.gz를 비롯한 파일들을 넣으면 된다.
SPECS에 xxx.spec파일을 만들어서 넣는다.

2008-05-20 추가 : src.rpm 일 경우 설치해버면 자동으로 위 경로들에 각각의 파일들이 배치된다.

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

위와 같은 준비가 되었으면 빌드하자.

rpmbuild -ba xxx.spec

spec에 작성한대로 컴파일되고 지지고 볶아서 xxx.i386.rpm과 xxx.src.rpm, xxx-debuginfo.i386.rpm등이 생성된다.

xxx.src.rpm은 SRPMS에 생성된다
xxx.rpm과 debuginfo.rpm은 RPMS/i386에 생성된다.

이제 SRPMS만 있으면 나중에 또 할 수 있다.
- 나머진 버려도 되는건가?

------------------------------------------------
기타 :
debuginfo는 뭔지 모르겠다.

spec에서 define한 릴리즈와 버전대로 파일명이 생성된다.
예를 들어
%define name xxx
%define version 1.1.0
%define release fz1-0
으로 했다면
xxx-1.1.0-fz1-0.i386.rpm
으로 생성될 것이다.
------------------------------------------------
기타 2 :
rpmbuild시 --target=옵션을 추가로 사용할 수 있다.
ex) rpmbuild -ba --target=i686 xxx.spec
이렇게하면 RPMS/i686안에 rpm파일들이 생길 것이다.
------------------------------------------------
기타 3 :
KLDP의 RPM_Guide에 따르면 rpmrc에서 빌드디렉토리도 설정한다고 하는데 안보인다.
어디에 숨었니 -_-;;
그리고 여러가지 타겟들이 적혀있다.
- 설마 정의된 타겟이라면 별다른 과정없이 타겟지정만으로 크로스컴파일도 지원하는걸까?
-> 설마가 사람잡았다. target=arm-linux라고 줬더니 arm.rpm이 생성됐다. -_-;;
--> 빌드메세지를 캡쳐해보니 이런 메세지가 나왔다. checking target system type... i686-pc-linux-gnu
---> 그러므로 엉터리였다. 당연히도 spec파일을 크로스컴파일용으로 작성해야겠지...

----> 그렇다면 i686 같은 패키지를 만들려고 해도 마찬가지라는 것??
------------------------------------------------

어지간히 정리되면 문서도 정리해야겠다.
언제 정리하나...
Posted by freezn
삽질기행/잡다정보2006. 10. 18. 23:43
- 알아두면 편리한 경로 변수들 %{buildroot} 빌드경로
%{_bindir} /usr/bin
%{_libdir} /usr/lib
%{_includedir} /usr/include
%{_sbindir} /usr/sbin
%{_mandir} /usr/share/man
%{_docdir} /usr/share/doc
%{_sysconfdir} /etc
%{_tmppath} /var/tmp
Posted by freezn
CPU : AMD64 x86_64
OS : RHEL 4.1
smtp/current 에러 내용 :
@400000004461b5440c073364 tcpserver: fatal: temporarily unable to figure out IP address for 0.0.0.0: file does not exist

결론은 qmail-smtpd, checkpassword 가 64로 컴파일 할 경우 정상동작하지 않는다.

결국 저 두파일만 32비트 머신에서 컴파일한 버전으로 끼워 맞췄다. (설정들을 똑같게 하도록 64비트에서 패치한 소스를 그대로 가져다가 빌드했다.)

해결책 출처 :
http://qmail.kldp.org/phpbb/viewtopic.php?t=5809&highlight=amd64



qmail용 64비트 패치를 어디선가 본 것 같은데...

Posted by freezn
메일이 안가길래 로그를 확인해보니 너무 많아서-_-; 아예 최소로 돌리고 다음과 같이 직접 실행으로 테스트해봤다.

명령 :
/usr/local/bin/tcpserver -vHRl 0 -x /etc/tcp.smtp.cdb 0 25 cat

에러 :
tcpserver: fatal: temporarily unable to figure out IP address for 0.0.0.0: file does not exist

qmail 관련 forum들을 찾아보면 AMD64(옵테론,Opteron)인 경우 이 상황을 자주 만나는 듯 하다.
황당하지만 이렇게 하면 해결된다.

해결 :
touch /etc/dnsrewrite


정보 출처 :
http://forums.gentoo.org/viewtopic-p-2639199.html#2639199

qmail은 AMD64랑 궁합이 잘 맞지 않는가보다 ㅡㅜ
...옵테론 미워할거야 ㅡㅜ

- AMD64 에서만 이 문제가 나는 이유는 뭘까?? 자동으로 파일을 생성하지 못하나??
Posted by freezn
2가지 방법
- 인터럽트로 받기
- 그냥 받기 -_-;

#include <iom128.h>
#include <ina90.h>
#include <sig-avr.h>
#include <interrupt.h>

#define SYSTEM_CLOCK 8000000 // CLOCK (X-tal frequency) (128L : 8Mhz)

typedef unsigned char BYTE;

volatile BYTE RS0_Char=0x00;
volatile BYTE RS1_Char=0x00;

void SendByte0(BYTE data)
{
while (!(inp(UCSR0A) & (1<<UDRE)));
outp(data, UDR0);
}

void SendByte1(BYTE data)
{
while (!(inp(UCSR1A) & (1<<UDRE)));
outp(data, UDR1);
}


SIGNAL(SIG_UART0_RECV) // UART0 수신 인터럽트
{
RS0_Char=inp(UDR0);
SendByte0(RS0_Char);
}

SIGNAL(SIG_UART1_RECV) // UART1 수신 인터럽트
{
RS1_Char=inp(UDR1);
SendByte0(RS1_Char);
}



void UART_Init(unsigned long BaudRate)
{
// Not Double mode, Not multi_communication
outp(0x00, UCSR0A);
// 0b 1001 1000 RXCIE,TXCIE,UDRIE,RxEN,TxEN,xxx
outp(0x98, UCSR0B);
outp(0x06, UCSR0C);
// Setting BaudRate
outp(0x00, UBRR0H);
outp((SYSTEM_CLOCK/BaudRate/16 - 1),UBRR0L);

// Not Double mode, Not multi_communication
outp(0x00, UCSR1A);
// 0b 1001 1000 RXCIE,TXCIE,UDRIE,RxEN,TxEN,xxx
outp(0x98, UCSR1B);
outp(0x06, UCSR1C);
// Setting BaudRate
outp(0x00, UBRR1H);
outp((SYSTEM_CLOCK/BaudRate/16 - 1),UBRR1L);
}

int main(void)
{
// External Memory Disable
outp(0x00, MCUCR);
UART_Init(9600);
sei();

while(1);

return 0;
}


uart0이나 uart1이 수신인터럽트가 발생할때마다 다시 각각 uart0/1에 같은 내용을 바이트단위로 전송해준다.

지금 사용중인 보드의 제조사 http://myavr.co.kr 의 자료를 이해하느라 아주 조금 수정했다 ;
Posted by freezn