adosample.cpp
来自「《Windows CE 权威指南》(作者:(美)CHRIS MUENCH」· C++ 代码 · 共 679 行 · 第 1/2 页
CPP
679 行
// <BOOK Necessary due to Compatibility Wrapper in ADOCE30.h>
const IID IID__Recordset20 = {0x4BEB93D5,0x28D8,0x11D1,{0x83,0x21,0x00,0xA0,0x24,0xA8,0x81,0x10}};
// </BOOK Necessary due to Compatibility Wrapper in ADOCE30.h>
TCHAR tsADOCE30ConnProgID[]= TEXT("ADOCE.Connection.3.0");
TCHAR tsADOCE30RSProgID[]= TEXT("ADOCE.Recordset.3.0");
TCHAR tsADOCE20RSProgID[]= TEXT("ADOCE.Recordset.1");
CLSID tClsid;
VariantInit(&varConn1);
VariantInit(&vaEmpty);
HRESULT hr;
if (FAILED(CoInitializeEx(NULL, COINIT_MULTITHREADED)))
return FALSE;
// Step1 - Open/Create a database
// *********************************************
hr = CLSIDFromProgID( tsADOCE30ConnProgID, &tClsid );
if (!FAILED(hr))
{ // ADOCE3.0 found !!
hr=CoCreateInstance(tClsid,NULL,CLSCTX_INPROC_SERVER,
IID__Connection, (LPVOID *)&Conn1);
hr=Conn1->put_Provider(TEXT("cedb"));
hr=Conn1->Open(TEXT(""),TEXT(""),TEXT(""),adOpenUnspecified);
hr=CLSIDFromProgID( tsADOCE30RSProgID, &tClsid );
hr=CoCreateInstance(tClsid,NULL,CLSCTX_INPROC_SERVER,
IID__Recordset,(LPVOID *)&Rs1);
varConn1.pdispVal=Conn1;
varConn1.vt=VT_DISPATCH;
hr=Rs1->put_ActiveConnection(varConn1);
bADOCE3=TRUE;
}
else
{ // Is at ADOCE2.0 there ?
hr=CLSIDFromProgID( tsADOCE20RSProgID, &tClsid );
hr=CoCreateInstance(tClsid,NULL,CLSCTX_INPROC_SERVER,
IID__Recordset20 ,(LPVOID *)&Rs1);
}
if (FAILED(hr)) return FALSE; // No ADOCE there... leave
hr=Rs1->Open(_variant_t(TEXT("DROP TABLE Book841")),vaEmpty,
adOpenForwardOnly , adLockReadOnly ,adCmdUnknown);
hr=Rs1->Open(_variant_t(TEXT("CREATE TABLE Book841 (MyInt integer, MyDate datetime, MyString varchar(200), MyBlob long varbinary)")),
_variant_t(TEXT("")),adOpenForwardOnly , adLockReadOnly , adCmdUnknown);
if (FAILED(hr)) return FALSE; // Error handling
wprintf(TEXT("Step1 Complete: Database Created\n\r"));
// Step2 - Writing a record
// *********************************************
hr=Rs1->Open(_variant_t(TEXT("select * from Book841")),_variant_t(TEXT("")),
adOpenKeyset , adLockOptimistic , adCmdUnknown);
if (FAILED(hr)) return FALSE; // Error handling
hr=Rs1->AddNew(vaEmpty,vaEmpty);
hr=Rs1->get_Fields(&Fields);
hr=Fields->get_Count(&FldCnt);
for (int i=0;i<FldCnt;i++)
{
if (bADOCE3)
hr=Fields->get_Item(_variant_t((long)i),&Field);
else
hr=Fields->get_Item(_variant_t((long)i),(struct Field **)&Field20);
VariantInit(&value);
switch (i)
{
case 0:
if (bADOCE3)
hr=Field->put_Value(_variant_t(-1L));
else
hr=Field20->put_Value(_variant_t(-1L));
break;
case 1:
value.vt=VT_DATE;
GetSystemTime(&MyTime);
SystemTimeToVariantTime(&MyTime,&value.date);
if (bADOCE3)
hr=Field->put_Value(value);
else
hr=Field20->put_Value(value);
break;
case 2:
if (bADOCE3)
hr=Field->put_Value(_variant_t(TEXT("This is a string")));
else
hr=Field20->put_Value(_variant_t(TEXT("This is a string")));
break;
case 3:
if (bADOCE3)
hr=Field->put_Value(_variant_t(TEXT("This is a blob-string")));
else
hr=Field20->put_Value(_variant_t(TEXT("This is a blob-string")));
break;
default: break;
}
}
hr=Rs1->Update(vaEmpty,vaEmpty);
if (FAILED(hr)) return FALSE; // Error handling
// or
//hr=Rs1->Open(_variant_t(TEXT("INSERT INTO Book841 "
// "(MyInt,MyDate,MyString) VALUES "
// "(1,'1/1/1999 12:12','This is a string')")),
// _variant_t(TEXT("")),
// adOpenForwardOnly , adLockReadOnly , 1);
wprintf(TEXT("Step2 Complete: New Record Written\n\r"));
// Step3 - Reading a record
// *********************************************
Rs1->MoveFirst();
int RecCnt=0;
Rs1->get_BOF(&tBOF);
Rs1->get_EOF(&tEOF);
if(!(tBOF==VARIANT_TRUE && tEOF==VARIANT_TRUE))
{
while (tEOF!=VARIANT_TRUE)
{
hr=Rs1->get_Fields(&Fields);
hr=Fields->get_Count(&FldCnt);
for (int i=0;i<FldCnt;i++)
{
VariantInit(&value);
if (bADOCE3)
{
hr=Fields->get_Item(_variant_t((long)i),&Field);
hr=Field->get_Value(&value);
}
else
{
hr=Fields->get_Item(_variant_t((long)i),(struct Field **)&Field20);
hr=Field20->get_Value(&value);
}
VariantChangeType(&vaEmpty,&value,0,VT_BSTR);
if (vaEmpty.vt==VT_BSTR)
wprintf(TEXT("Property #%d = <%s>\n\r"),i,vaEmpty.bstrVal);
}
Rs1->MoveNext();
Rs1->get_EOF(&tEOF);
RecCnt++;
}
}
wprintf(TEXT("Step3: Read %d Records\n\r"),RecCnt);
// Step4 - Closing the Database
// *********************************************
Rs1->Close();
Rs1->Release();
if (bADOCE3)
Conn1->Release();
CoUninitialize();
wprintf(TEXT("Step4 Complete: All closed\n\r"),RecCnt);
// </BOOK_ADDON Chapter 8.4.1> *************************************************
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_ADOSAMPLE);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage is only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ADOSAMPLE));
wc.hCursor = 0;
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = szWindowClass;
return RegisterClass(&wc);
}
//
// FUNCTION: InitInstance(HANDLE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // The window class name
hInst = hInstance; // Store instance handle in our global variable
// Initialize global strings
LoadString(hInstance, IDC_ADOSAMPLE, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance, szWindowClass);
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
if (hwndCB)
CommandBar_Show(hwndCB, TRUE);
return TRUE;
}
//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
int wmId, wmEvent;
PAINTSTRUCT ps;
TCHAR szHello[MAX_LOADSTRING];
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_HELP_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_FILE_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_CREATE:
hwndCB = CommandBar_Create(hInst, hWnd, 1);
CommandBar_InsertMenubar(hwndCB, hInst, IDM_MENU, 0);
CommandBar_AddAdornments(hwndCB, 0, 0);
break;
case WM_PAINT:
RECT rt;
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rt);
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
DrawText(hdc, szHello, _tcslen(szHello), &rt,
DT_SINGLELINE | DT_VCENTER | DT_CENTER);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
CommandBar_Destroy(hwndCB);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Mesage handler for the About box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
RECT rt, rt1;
int DlgWidth, DlgHeight; // dialog width and height in pixel units
int NewPosX, NewPosY;
switch (message)
{
case WM_INITDIALOG:
// trying to center the About dialog
if (GetWindowRect(hDlg, &rt1)) {
GetClientRect(GetParent(hDlg), &rt);
DlgWidth = rt1.right - rt1.left;
DlgHeight = rt1.bottom - rt1.top ;
NewPosX = (rt.right - rt.left - DlgWidth)/2;
NewPosY = (rt.bottom - rt.top - DlgHeight)/2;
// if the About box is larger than the physical screen
if (NewPosX < 0) NewPosX = 0;
if (NewPosY < 0) NewPosY = 0;
SetWindowPos(hDlg, 0, NewPosX, NewPosY,
0, 0, SWP_NOZORDER | SWP_NOSIZE);
}
return TRUE;
case WM_COMMAND:
if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL))
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?