기본 콘텐츠로 건너뛰기

4월, 2010의 게시물 표시

[VB] DLL 호출

간만에 VB 6.0으로 작업할 일이 생겼는데, VC 6.0으로 만든 DLL 함수를 호출하고 나서 프로그램이 죽는 현상이 발생했습니다. 그 DLL은 이제까지 아무 문제 없이 잘 사용해 왔습니다. 그 원인을 몰라 한참이나 코드를 들여다 보고 있다가, 문득 DLL 호출은 일반 함수에서 하면 에러가 발생한다는 얘기를 생각해 내었습니다. 'DLL 함수 호출은 이벤트 처리 함수에서 호출해야 한다.' 그 이유는 잘 모르겠습니다.

문자열 다루기

카페 > 프로그래머들의 세계 | 필더 http://cafe.naver.com/programmers/649 문자열 다루기 STL의 string을 사용 #include <TCHAR.h> #include <string> namespace std { typedef basic_string<TCHAR> tstring; } To be continued... static 함수 및 버퍼 사용 /** * Maps a character string to a wide-character (Unicode) string. * @param[in] lpsz ASCII string * @return UNICODE string */ static WCHAR* ToWChar(LPCSTR* lpsz) { static WCHAR wszBuffer[1024]; _wcsset(wszBuffer, 0); int nWStrLen = /* the number of wide characters written to the buffer */ MultiByteToWideChar( CP_ACP, /* CodePage: ANSI code page */ 0, /* dwFlags: character-type options */ lpsz, /* lpMultiByteStr: string to map */ -1, /* cbMultiByte: number of bytes in string */ wszBuffer, /* lpWideCharStr: wide-character buffer */ 1024); /* cchWideChar: size of

Cell 삽입하기

CELL을 입력하기 위해서는 아래의 루틴을 따르면 됩니다. CELL이 들어 있는 Cell Library 파일을 Attach 시킵니다.(이미 Attach되어 있으면 다시 Attach 시킬 필요가 없습니다.) Cell Library에서 삽입할 Cell을 Cell 이름을 통해서 구해와 삽입합니다. 간단하죠.... 그럼 아래 제가 사용한 코드를 보도록 하겠습니다... /* ANSI C includes */ #include stdlib.h> #include stdio.h> #include string.h> #include assert.h> /* MDL H includes */ #include mdl.h> #include cmdlist.h> #include dlogids.h> #include dlogitem.h> #include mdlerrs.h> /* MDL FDF includes */ #include ditemlib.fdf> #include dlogman.fdf> #include mscexpr.fdf> #include mscnv.fdf> #include msdialog.fdf> #include msoutput.fdf> #include msrsrc.fdf> #include msstate.fdf> #include mssystem.fdf> #include mdllib.fdf> #include msmline.fdf> #include tcb.h> /*----------------------------------------------------------------------+ | | | name loadCellLibraryIfNeeded | | | | author BSI 6/91 | | | +----------------------------------------------------------------------*/ Private voi

CMFCColorButton

Palette를 사용하여 Color Pick Bar를 확장하는 것을 알아 보도록 하겠습니다. 말 그대로 선택할 색상들을 이용해 Palette를 생성한 다음 CMFCColorButton에 연결시키면 그걸로 끝~입니다. // get color from table const CString rPaletteFilePath = GetExecPath() + _T("Setting\\PALETTE.TBL"); ifstream ifile(rPaletteFilePath.operator LPCTSTR()); if(ifile.is_open()) { vector<string> oResult; string aLine; while(!ifile.eof()) { getline(ifile , aLine); if(ifile.eof()) break; CTokenizer<CIsComma>::Tokenize(oResult , aLine , CIsComma()); if(3 == oResult.size()) { BYTE bR = atoi(oResult[0].c_str()); BYTE bG = atoi(oResult[1].c_str()); BYTE bB = atoi(oResult[2].c_str()); m_RedEntry.push_back(bR); m_GreenEntry.push_back(bG); m_BlueEntry.push_back(bB); } } const UINT NUM_COLOURS = m_RedEntry.size(); const UINT nSize = sizeof(LOGPALETTE) + sizeof(PALETTEENTRY)*NUM_COLOURS; LOGPALETTE *pLogPalette = (LOGPALETTE*)calloc(nSize , sizeof(BYTE)); pLogPalette->palVersion = 0x300; pLogPalette->palNumEntries = NUM_COLOURS; f

[NSIS] 사용자 페이지 추가하기

NSIS에서 사용자 페이지를 추가하는 방법을 알아봅시다. 일단은 추가할 페이지를 디자인해야 하는데, HM NIS을 사용하는 것이 편합니다. 아마도 이글을 보시는 분들은 다들 설치를 하셨겠죠... File-> New Install Options file 저는 아래와 같이 간단히 디자인을 했습니다. 이렇게 디자인한 내용은 ini 파일 형식으로 저장이 됩니다. 그리고 나중에 ini 파일 형식에서 사용자가 입력한 내용을 가져오게 됩니다. .onInit 에서 아래의 두 줄을 추가합니다. InitPluginsDir File /oname=$INSTDIR\AutoUGM_NSIS.ini "AutoUGM_NSIS.ini" ;ini을 Install 폴더에 복사 만든 페이지를 추가합니다. Page custom AutoUGM_NSIS AutoUGM_NSISLeave ; msapps폴더를 선택하는 화면 AutoUGM_NSIS 와 AutoUGM_NSIS는 페이지가 시작될 때 그리고 끝날 때 실행되는 함수이므로 함수를 추가해 줘야 합니다. 아래는 저의 예제입니다. Function AutoUGM_NSIS Push ${TEMP1} !insertmacro MUI_HEADER_TEXT 'mdlapps' 'ma 파일을 설치할 폴더를 선택하세요' ; 헤더에 나타낼 텍스트 InstallOptions::dialog "$INSTDIR\AutoUGM_NSIS.ini" ; 페이지를 화면에 보이게 됩니다. Pop ${TEMP1} Pop ${TEMP1} FunctionEnd Function AutoUGM_NSISLeave ReadINIStr $hMdlApps_Folder "$INSTDIR\AutoUGM_NSIS.ini" "Field 2" "State" ;사용자가 입력한 내용을 ini 파일을 통

mdlLinkage_appendUsingDescr 사용하기

mdlLinkage_appendUsingDescr을 사용하면 만들어진 Graphic Data에 여분의 사용자 데이터를 추가할수 있습니다. 아래 코드를 보시죠. LinkageHeader tLinkHdr; int nStatus; memset(tLinkHdr, '\0' , sizeof(LinkageHeader)); tLinkHdr.info =0; tLinkHdr.remote =0; tLinkHdr.modified =0; tLinkHdr.user =1; tLinkHdr.class =0; tLinkHdr.words; tLinkHdr.primaryID = SIGNATUREID_FDNPROJECT; memset(elementInfo,'\0',sizeof(ElementInfo)); strncpy(elementInfo.name,element->name,64); strncpy(elementInfo.site,element->site,64); strncpy(elementInfo.zone,element->zone,64); nStatus = mdlLinkage_appendUsingDescr( elemDescrPP, tLinkHdr, elementInfo, DATADEFID_ELEMENT_INFO, // data def resource ID NULL, // conversion rules FALSE); if(SUCCESS != nStatus) { mdlDialog_dmsgsPrint("mdlLinkage_appendUsingDescr function error"); } SIGNATUREID_FDNPROJECT은 사용자 데이터의 ID라고 생각하시면 되구요. DATADEFID_ELEMENT_INFO은 사용자 데이터 구조의 ID라 생각하시면 됩니다. 이러한 사용자 데이터 구조는 리소스에 포함되어 컴파일 되어야 합니다. 따라서 프로그램

PDS 3D 모델을 이용해서 2D 도면 생성 로직 V7 / MSTN/MDL/VBA

PDS 3D 모델을 이용해서 2D 도면 생성 로직을 간단하게 FLOW CHART형식으로 표현해 보았습니다. 여기서 2D DWG FILE NAME은 PDS에서 작성한 HIDDEN 도면을 말하는 겁니다. 그리고 121,122,123,113은 PDS에서 사용하는 테이블 이름을 의미합니다.

Microstation J를 VB에서 호출하기

먼저 VB에서 호출하기 위해서는 레지스트리에 Microstation.Application의 PROGID가 아래와 같이 존재하여야 합니다. 먼저 VB에서 호출하기 위해서는 레지스트리에 Microstation.Application의 PROGID가 아래와 같이 존재하여야 합니다. 여기서 msApp의 Visible을 활성화 시키지 않으면 msApp에 명령어를 보내기 위해 사용하는 MbeSendCommand가 제대로 실행되지 않습니다. --> 주의 위 코드는 msApp를 생성해서 명령행으로 주어지는 dgn 파일을 오픈하는 코드입니다. 위와 유사한 코드를 Python에서 하려고 시도했었는데, Python에서는 msApp Object를 제대로 가져오지 못하고 에러가 발생하더군요. 이런면을 보면 VB가 참 잘 만들어 졌다고 보여집니다. 위의 코드는 수정되어야 합니다. MSTN J 상위 버젼이 설치되어 있는 경우에 위의 코드는 제대로 작동하지 않습니다. 그래서 트릭으로 MSTN J를 Shell 함수를 통해서 강제로 실행 시킨 후에 GetObject("","Microstation.Application") 을 통해서 Microstation Object를 가져올 수 있습니다. 이것 마저도 되지 않을때 MSTN J를 다시 설치하시면 될것입니다.