콘솔에서 돌아가는 C 프로그램을 작성하고 있습니다. MS-SQL 서버와 연결하려면 어떻게 해야 합니까.
MFC를 이용한 응용 프로그램을 사용해 콘솔 프로그램을 만듭니다. 그런 후에 다음처럼 ODBC를 연결하면 됩니다.
<리스트 1>콘솔 프로그램을 ODBC에 연결
// 선언
CDatabase m_dbSeaDB;
// 구현
// "Sss"는 ODBC에서
등록된 이름
// _T("ODBC; DSN = Sss; UID = dba; PWD = sql") 는
//
ODBC를 열기 위한 명령
m_dbSeaDB.Open("_T("Sss"), FALSE, FALSE,
_T("ODBC; DSN = Sss; UID = dba; PWD = sql"));
// 다음은 테이블을
열기 위한 예제입니다.
// 위, 경도의 Long값 자료 두 개에서 코드가 007인 자료만
찾을 조건
// 위, 경도는 문자열
CRecordset ExamSet(&m_dbSeaDB);
try
{
ExamSet.Open(
CRecordset::forwardOnly,
"SELECT Longi, Lati, Value1, Value2" \
FROM
MyTable WHERE Code = '007' "
);
}
catch(CDBException
*e) {
MessageBox(e->m_strError, "잘못!",
MB_ICONSTOP);
e->Delete();
return;
}
//
읽어들인 자료를 핸들링
CString strLo, strLa;
CDBVariant varVel_e;
CDBVariant
varVel_n;
while(!ExamSet.IsEOF()) {
//
0, 1, 2, 3 은 SELECT 문의 순서
ExamSet.GetFieldValue((short)0,
strLo);
ExamSet.GetFieldValue((short)0,
strLa);
// SQL_C_SLONGdms Value1, Value2를
Long으로 읽어들임.
ExamSet.GetFieldValue((short)2,
varVel_e, SQL_C_SLONG);
ExamSet.GetFieldValue((short)3,
varVel_n, SQL_C_SLONG);
ExamSet.MoveNext();
}
비주얼 C++로 만든 애플리케이션에서 버튼을 눌렀을 때 익스플로러를 실행하고 싶습니다. 특정 사이트가 열리도록 말입니다.
--- Now Working ---
SendMessage를 이용해 문자를 다른 윈도우에 보내다가 핸들 문제 때문에 keybd_event를 사용하려는데, 영어와 달리 한글의 경우는 전송이 원하는 대로 이뤄지지 않습니다. keybd_event에서 한글은 어떤 식으로 처리해 줘야 합니까.
keybd_event()를 제대로 쓰려면 고려할 사항이 있습니다. 일단 keybd_event()는 사용자가 키를 누르는 동작을 그대로 흉내내는 것이라 이해해야 합니다(즉, SendMessage()와는 아무런 관련이 없습니다). 예를 들어 키보드에서 'A' 키를 누른다고 항상 'A' 가 입력되는 것은 아니라는 말입니다. CAPS_LOCK이 안 눌려 있다면 'A' 키를 눌러도 'a' 로 입력됩니다. 이 경우 keybd_event() 로 CAPS_LOCK 키를 누르고 'A' 키를 눌러야 합니다.
keybd_event(VK_CAPITAL, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event(VK_CAPITAL,
0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
keybd_event('A',
MapVirtualKey('A', 0), 0, 0);
keybd_event('A', MapVirtualKey('A', 0),
KEYEVENTF_KEYUP, 0);
물론 이전에 CAPS_LOCK 상태를 확인해야 하며, 방법은 다음과 같습니다.
BOOL bState = GetKeyState(VK_CAPITAL);
한글문제도 마찬가지입니다. IME 상태가 한글이라면 'A'키를 누르면 'ㅁ'가 입력되겠죠. 'S'를 누르면 'ㄴ'일테구요, 따라서 한글을 입력하려면 IME 상태를 확인한 후 영문이라면 한글 키를 누르는 과정이 들어가야 합니다. 즉, "My name is 바보." 를 입력하려면 (CAPS_LOCK : off, 한글 : off일 때) 다음과 같이 하면 됩니다.
> (shift down), M, (shift up), Y, (스페이스), N, A, M, E, (스페이스),
I, S, (스페이스)
> (한글키), R, L, A, G, U, S, T, M, D, (한글키), . //
HP 그래픽 워크스테이션에서 한글
이와 같이 이벤트를 발생시킨 다음, 한글키는 다음과 같이 사용합니다.
BOOL bState = GetKeyState(VK_HANGEUL); // 한글이면 1, 아니면
0
if(!bState) {
keybd_event(VK_HANGEUL, MapVirtualKey(VK_HANGEUL,
0), 0, 0);
keybd_event(VK_HANGEUL, MapVirtualKey(VK_HANGEUL,
0), KEYEVENTF_KEYUP, 0);
}
캡처한 화면을 MemDC에 메모리 비트맵으로 만든 후, 이를 다시 비트맵 파일로 저장하려 합니다. 어떻게 하면 될까요.
<리스트 4>를 살펴보면 고민이 바로 해결될 것입니다.
<리스트 4> MemDC를 BMP 파일로 만드는 코드
void OnCommandCapture()
{
HWND hWnd =
(HWND)wParam;
int nNum = (int)lParam;
BOOL
flag = TRUE;
CBitmap *pBitmap;
CWnd
tmpWnd;
CClientDC dc(tmpWnd, GetDesktopWindow());
CDC
memDC;
CRect rectWnd;
RECT
tmpRect;
TCHAR szImageFileName[255];
TCHAR
szNumber[255];
TCHAR szFileName[255];
itoa(nNum,
szNumber, 10);
::GetSystemDirectory(szImageFileName,
256);
sprintf(szFileName, "%s\\+%s+.bmp",
szImageFileName, szNumber);
::GetWindowRect(hWnd,
&tmpRect);
rectWnd.SetRect(tmpRect.left,
tmpRect.top, tmpRect.right, tmpRect.bottom)
memDC.CreateCompatibleDC(&dc);
pBitmap
= new CBitmap;
pBitmap->CreateCompatibleBitmap(&dc,
rectWnd.Width(), rectWnd.Height());
// m_sizeInPixels.cx
CBitmap
*pOldBitmap = memDC.SelectObject(pBitmap);
memDC.BitBlt(0,
0, rectWnd.Width(), rectWnd.Height(), &dc,
rectWnd.left,
rectWnd.top, SRCCOPY);
memDC.SelectObject(pOldBitmap);
CPalette
tmpPal;
HANDLE hDIB = DDBToDIB(*pBitmap, BI_RGB,
&tmpPal);
WriteDIB(szFileName, hDIB);
GlobalFree(hDIB);
delete
pBitmap;
return;
}
........
중략 ..........
CFile file;
if(!file.Open(szFile,
CFile::
--- Now Working ---