Archive for the ‘C言語’ Category
-
Hello, Tcl/Tk(C言語) World!
Posted on 5月 12th, 2013 by cx20
Tcl/Tk(C言語)
Tcl はシンプルな構文を持つスクリプト言語である。名前は「ツールコマンド言語(Tool Command Language)」に由来する。
Tcl スクリプト用の GUI ツールキットとして Tk が開発され、バンドルされたものを Tcl/Tk と呼ぶ。Tk の人気は高く、Tcl/Tk 以外に Perl/Tk、Ruby/Tk と言った他の言語にも移植されている。
以下は C言語 による Tcl/Tk の呼出し例となっている。ソースコード
#include <tcl.h> #include <tk.h> int main( int argc, char* argv[] ) { Tcl_Interp* interp; char command[] = "wm title . \"Hello, World!\"\n" "wm geometry . \"640x480\"\n" "label .label -text \"Hello, Tcl/Tk World!\"\n" "pack .label -side top -anchor w"; interp = Tcl_CreateInterp(); Tcl_Init(interp); Tk_Init(interp); Tcl_Eval( interp, command ); Tk_MainLoop(); return 0; }
コンパイル方法(Visual C++)
C:¥> cl hello.c /link tcl85.lib tk85.lib
実行結果
+------------------------------------------+ |Hello, World! [_][~][X]| +------------------------------------------+ |Hello, Tcl/Tk World! | | | | | | | | | | | | | | | | | | | +------------------------------------------+
-
Hello, DirectX(C言語) World!
Posted on 7月 22nd, 2012 by cx20
Win32 DirectX(C言語)
DirectX はマイクロソフトが Wnidows 用に開発したマルチメディア処理用 API である。
以下は C++ における DirectX アプリケーション の例となっている。ソースコード
#include <windows.h> #include <tchar.h> #include <d3d9.h> #include <d3dx9.h> LPDIRECT3D9 g_pD3D = NULL; LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; LPD3DXFONT g_pd3dFont = NULL; RECT g_rect = { 0, 0, 0, 0 }; HRESULT InitD3D( HWND hWnd ); HRESULT InitFont(); VOID Cleanup(); VOID Render(); HRESULT InitD3D( HWND hWnd ) { HRESULT hr; D3DPRESENT_PARAMETERS d3dpp; g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ); if( g_pD3D == NULL ) { return E_FAIL; } d3dpp.BackBufferWidth = 0; d3dpp.BackBufferHeight = 0; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; d3dpp.BackBufferCount = 0; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.MultiSampleQuality = 0; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = NULL; d3dpp.Windowed = TRUE; d3dpp.EnableAutoDepthStencil = 0; d3dpp.AutoDepthStencilFormat = D3DFMT_UNKNOWN; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = 0; hr = g_pD3D->lpVtbl->CreateDevice( g_pD3D, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ); if( FAILED( hr ) ) { return E_FAIL; } return S_OK; } HRESULT InitFont() { HRESULT hr; D3DXFONT_DESC lf; lf.Height = 16; lf.Width = 0; lf.Weight = 0; lf.MipLevels = 1; lf.Italic = 0; lf.CharSet = SHIFTJIS_CHARSET; lf.OutputPrecision = OUT_TT_ONLY_PRECIS; lf.Quality = PROOF_QUALITY; lf.PitchAndFamily = FIXED_PITCH | FF_MODERN; lstrcpy( lf.FaceName, _T("MS ゴシック") ); hr = D3DXCreateFontIndirect( g_pd3dDevice, &lf, &g_pd3dFont ); if ( FAILED( hr ) ) { Cleanup(); return hr; } hr = g_pd3dFont->lpVtbl->DrawText( g_pd3dFont, NULL, _T("Hello, DirectX World!"), -1, &g_rect, DT_CALCRECT | DT_LEFT | DT_SINGLELINE, 0xffffffff ); if ( FAILED( hr ) ) { Cleanup(); return hr; } return hr; } VOID Cleanup() { if ( g_pd3dFont != NULL ) { g_pd3dFont->lpVtbl->Release( g_pd3dFont ); } if( g_pd3dDevice != NULL ) { g_pd3dDevice->lpVtbl->Release( g_pd3dDevice ); } if( g_pD3D != NULL ) { g_pD3D->lpVtbl->Release( g_pD3D ); } } VOID Render() { if( g_pd3dDevice == NULL ) { return; } if ( g_pd3dFont == NULL ) { return; } g_pd3dDevice->lpVtbl->Clear( g_pd3dDevice, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0 ); if( SUCCEEDED( g_pd3dDevice->lpVtbl->BeginScene( g_pd3dDevice ) ) ) { g_pd3dFont->lpVtbl->DrawText( g_pd3dFont, NULL, _T("Hello, DirectX World!"), -1, &g_rect, DT_LEFT | DT_SINGLELINE, 0xffffffff ); g_pd3dDevice->lpVtbl->EndScene( g_pd3dDevice ); } g_pd3dDevice->lpVtbl->Present( g_pd3dDevice, NULL, NULL, NULL, NULL ); } LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { case WM_DESTROY: Cleanup(); PostQuitMessage( 0 ); return 0; case WM_PAINT: Render(); ValidateRect( hWnd, NULL ); return 0; } return DefWindowProc( hWnd, message, wParam, lParam ); } int APIENTRY _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow ) { LPCTSTR lpszClassName = _T("helloWindow"); LPCTSTR lpszWindowName = _T("Hello, World!"); MSG msg; HWND hWnd; WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = lpszClassName; wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); RegisterClassEx(&wcex); hWnd = CreateWindow( lpszClassName, lpszWindowName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL ); InitD3D( hWnd ); InitFont(); ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); while( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } return 0; }
コンパイル方法
C:¥> SET INCLUDE=%DXSDK_DIR%INCLUDE;%INCLUDE% C:¥> SET LIB=%DXSDK_DIR%Libx86;%LIB% C:¥> cl hello.c ^ /link ^ user32.lib ^ dxguid.lib ^ d3d9.lib ^ d3dx9.lib ^ /SUBSYSTEM:WINDOWS
実行結果
+------------------------------------------+ |Hello, World! [_][~][X]| +------------------------------------------+ |Hello, DirectX World! | | | | | | | | | | | | | | | | | | | +------------------------------------------+
-
Hello, Win32 GUI(C言語) World!
Posted on 7月 1st, 2012 by cx20
Win32 GUI(C言語)
Win32 アプリケーションは Windows 標準 API である Win32 API を使用した Windows アプリケーションである。
以下は C言語 における Win32 GUI アプリケーション の例となっている。ソースコード
#include <windows.h> #include <tchar.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; LPCTSTR lpszMessage = _T("Hello, Win32 GUI World!"); switch (message) { case WM_PAINT: hdc = BeginPaint( hWnd, &ps ); TextOut( hdc, 0, 0, lpszMessage, lstrlen(lpszMessage) ); EndPaint( hWnd, &ps ); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); break; } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { LPCTSTR lpszClassName = _T("helloWindow"); LPCTSTR lpszWindowName = _T("Hello, World!"); WNDCLASSEX wcex; HWND hWnd; MSG msg; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = lpszClassName; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); RegisterClassEx(&wcex); hWnd = CreateWindow( lpszClassName, lpszWindowName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL ); ShowWindow(hWnd, SW_SHOWDEFAULT); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; }
コンパイル方法
C:¥> cl hello.c /link user32.lib gdi32.lib /SUBSYSTEM:WINDOWS
実行結果
+------------------------------------------+ |Hello, World! [_][~][X]| +------------------------------------------+ |Hello, Win32 GUI World! | | | | | | | | | | | | | | | | | | | +------------------------------------------+
-
Hello, COM(C言語) World!
Posted on 5月 7th, 2012 by cx20
COM(C言語)
COM(Component Object Model)はマイクロソフトの提唱するプログラム部品の仕様である。
COM を用いて開発された部品であれば言語を問わず利用することができる。
以下は C言語による COM クライアント(事前バインディングならびに実行時バインディング)の例となっている。
ここでは Windows 標準のプログラム部品である Shell.Application(Shell オブジェクト)の呼出しを例としてる。ソースコード(事前バインディング)
#include <shlobj.h> int main( int argc, char* argv[] ) { HRESULT hResult; IShellDispatch* pShell; VARIANT vRootFolder; Folder* pFolder; CoInitialize( NULL ); CoCreateInstance( &CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, &IID_IShellDispatch, (void**)&pShell ); VariantInit( &vRootFolder ); vRootFolder.vt = VT_I4; vRootFolder.lVal = ssfWINDOWS; pShell->lpVtbl->BrowseForFolder( (void*)pShell, 0, L"Hello, COM World!", 0, vRootFolder, &pFolder ); VariantClear( &vRootFolder ); if ( pFolder != NULL ) { pFolder->lpVtbl->Release( (void*)pFolder ); } pShell->lpVtbl->Release( (void*)pShell ); CoUninitialize(); return 0; }
コンパイル方法(Visual C++)
C:¥> cl hello.c /link ole32.lib
ソースコード(実行時バインディング)
#include <ole2.h> int main( int argc, char* argv[] ) { CLSID clsid; IDispatch* pShell; IDispatch* pFolder; DISPID dispid; OLECHAR* ptName = L"BrowseForFolder"; DISPPARAMS param = { NULL, NULL, 0, 0 }; VARIANT varg[4]; VARIANT vResult; CoInitialize( NULL ); CLSIDFromProgID(L"Shell.Application", &clsid ); CoCreateInstance( &clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IDispatch, (void**)&pShell); pShell->lpVtbl->GetIDsOfNames( (void*)pShell, &IID_NULL, &ptName, 1, GetUserDefaultLCID(), &dispid ); VariantInit( &varg[0] ); varg[0].vt = VT_I4; varg[0].lVal = 36L; /* ssfWINDOWS */ VariantInit( &varg[1] ); varg[1].vt = VT_I4; varg[1].lVal = 0L; VariantInit( &varg[2] ); varg[2].vt = VT_BSTR; varg[2].bstrVal = SysAllocString(L"Hello, COM World!"); VariantInit( &varg[3] ); varg[3].vt = VT_I4; varg[3].lVal = 0L; param.cArgs = 4; param.rgvarg = varg; pShell->lpVtbl->Invoke( (void*)pShell, dispid, &IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, ¶m, &vResult, NULL, NULL ); VariantInit( &varg[0] ); VariantInit( &varg[1] ); VariantInit( &varg[2] ); VariantInit( &varg[3] ); pFolder = V_DISPATCH( &vResult ); if ( pFolder != NULL ) { pFolder->lpVtbl->Release( (void*)pFolder ); } pShell->lpVtbl->Release( (void*)pShell ); CoUninitialize(); return 0; }
コンパイル方法(Visual C++)
C:¥> cl hello.c /link ole32.lib oleaut32.lib
コンパイル方法(MinGW 版 gcc)
C:¥> gcc -o hello hello.c -l ole32 -l oleaut32 -l uuid
実行結果
+----------------------------------------+ |Browse For Folder [X]| +----------------------------------------+ | Hello, COM Wolrd! | | | | +------------------------------------+ | | |[Windows] | | | | +[addins] | | | | +[AppCompat] | | | | +[AppPatch] | | | | +[assembly] | | | | : | | | | : | | | | : | | | +------------------------------------+ | | [Make New Folder] [ OK ] [Cancel] | +----------------------------------------+
-
Hello, Win32 API(DLL) World!
Posted on 4月 16th, 2012 by cx20
Win32 API(DLL)
Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
Win32 API は DLL として提供されており、ライブラリのリンク方法としては、インポートライブラリを使用した「暗黙的リンク」と LoadLibrary() による「明示的リンク」の2つの方法がある。
ここでは C言語による LoadLibrary() を用いた DLL の呼出しの例(明示的リンク)を記載する。ソースコード
#include <windows.h> #include <tchar.h> #ifdef UNICODE typedef int (WINAPI *PFNMESSAGEBOX)(HWND, LPCWSTR, LPCWSTR, UINT); #else typedef int (WINAPI *PFNMESSAGEBOX)(HWND, LPCSTR, LPCSTR, UINT); #endif int _tmain( int argc, TCHAR* argv[] ) { HINSTANCE hInstance = LoadLibrary( _T("user32.dll") ); #ifdef UNICODE PROC pfunc = GetProcAddress( hInstance, "MessageBoxW" ); #else PROC pfunc = GetProcAddress( hInstance, "MessageBoxA" ); #endif ((PFNMESSAGEBOX)pfunc)( NULL, _T("Hello, Win32 API(DLL) World!"), _T("Hello, World!"), MB_OK ); return 0; }
Win32 API は内部的に UNICODE 版(例:MessageBoxW)と ANSI 版(例:MessageBoxA)の2つのバージョンをもっており、GetProcAddress() による呼出しの場合は、UNICODE/ANSI どちらの関数であるか指定する必要がある。
Win32 API のプロトタイプ宣言(参考)
WINUSERAPI int WINAPI MessageBoxA( __in_opt HWND hWnd, __in_opt LPCSTR lpText, __in_opt LPCSTR lpCaption, __in UINT uType); WINUSERAPI int WINAPI MessageBoxW( __in_opt HWND hWnd, __in_opt LPCWSTR lpText, __in_opt LPCWSTR lpCaption, __in UINT uType); #ifdef UNICODE #define MessageBox MessageBoxW #else #define MessageBox MessageBoxA #endif // !UNICODE
コンパイル方法(Visual C++ / UNICODE ビルド)
C:¥> cl hello.c /DUNICODE /D_UNICODE
上記の「/D」オプションで指定している定義「UNICODE」は Win32 API 用、「_UNICODE」は、C ランタイム用の定義となっている。
コンパイル方法(Visual C++ / ANSI ビルド)
C:¥> cl hello.c
実行結果
--------------------------- Hello, World! --------------------------- Hello, Win32 API(DLL) World! --------------------------- OK ---------------------------
-
Hello, Win32 API(C言語) World!
Posted on 4月 13th, 2012 by cx20
Win32 API(C言語)
Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
以下は C言語 からの呼出し例である。ソースコード
#include <windows.h> #include <tchar.h> int _tmain( int argc, TCHAR* argv[] ) { MessageBox( NULL, _T("Hello, Win32 API World!"), _T("Hello, World!"), MB_OK ); return 0; }
コンパイル方法(Visual C++)
C:¥> cl hello.c /link user32.lib
実行結果
--------------------------- Hello, World! --------------------------- Hello, Win32 API World! --------------------------- OK ---------------------------
-
Hello, Win32 API(GUI) World!
Posted on 4月 12th, 2012 by cx20
Win32 API(GUI)
Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
ソースコード
#include <windows.h> #include <tchar.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MessageBox( NULL, _T("Hello, Win32 API(GUI) World!"), _T("Hello, World!"), MB_OK ); return 0; }
コンパイル方法(Visual C++)
C:¥> cl hello.c /link user32.lib /SUBSYSTEM:WINDOWS
実行結果
--------------------------- Hello, World! --------------------------- Hello, Win32 API(GUI) World! --------------------------- OK ---------------------------
-
Hello, Win32 API(CUI) World!
Posted on 4月 11th, 2012 by cx20
Win32 API(CUI)
Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
ソースコード
#include <windows.h> #include <tchar.h> int _tmain( int argc, TCHAR* argv[] ) { HANDLE hStdOutput; DWORD dwSize; TCHAR szBuf[256]; lstrcpy( szBuf, _T("Hello, Win32 API(CUI) World!n") ); hStdOutput = GetStdHandle( STD_OUTPUT_HANDLE ); WriteConsole( hStdOutput, szBuf, lstrlen(szBuf), &dwSize, NULL ); return 0; }
コンパイル方法(Visual C++)
C:¥> cl hello.c /link /SUBSYSTEM:CONSOLE
実行結果
Hello, Win32 API(CUI) World!
-
Hello, OCI World!
Posted on 3月 30th, 2012 by cx20
OCI
OCI(Oracle Call Interface)は Oracle Database 用の C API である。
OCI 7.x とそれ以降では、関数セットが大きく異なっており、現在は、新しい関数セットを用いることが推奨されている。旧(7.x) 新(7.x以降) 説明 opinit() OCIEnvCreate() 環境の作成 olon() OCILogon() ログイン ologof() OCILogoff() ログオフ oparse() OCIStmtPrepare() SQL文の準備 odefin() OCIDefineByPos() 項目と変数の関連付け oexec() OCIStmtExecute() SQL実行 ofetch() OCIStmtFetch2() 結果セットより行を取得 ocom() OCITransCommit() コミット orol() OCITransRollback() ロールバック なお、Windows に標準で導入されている Oracle 用のデータベースドライバとして以下のものがあるが、これらは、Oracle クライアントのバージョンとは無関係にOCI 7 API を呼び出す仕様の為、新しい機能を使う場合は、Oracle 社より提供されているドライバを使用する必要がある。
ファイル 種類 説明 MSORCL32.DLL ODBC ドライバ Microsoft ODBC for Oracle MSDAORA.DLL OLE DB プロバイダ Microsoft OLE DB Provider for Oracle ソースコード
#include <stdio.h> #include <string.h> #include <oci.h> int main( int argc, char* argv[] ) { sword status = OCI_SUCCESS; OCIEnv* envhp; OCIError* errhp; OCISvcCtx* svchp; OCIStmt* stmtp; OCIBind* bindp; OCIDefine* dfnp; char* username = "scott"; char* password = "tiger"; char* dbname = "orcl"; char* stmt = "SELECT 'Hello, OCI World!' AS Message FROM DUAL"; char message[64]; OCIEnvCreate(&envhp, OCI_DEFAULT, 0, 0, 0, 0, 0, 0); OCIHandleAlloc(envhp, &errhp, OCI_HTYPE_ERROR, 0, 0); OCILogon(envhp, errhp, &svchp, username, strlen(username), password, strlen(password), dbname, strlen(dbname)); OCIHandleAlloc(envhp, &stmtp, OCI_HTYPE_STMT, 0, 0); OCIStmtPrepare(stmtp, errhp, stmt, strlen(stmt), OCI_NTV_SYNTAX, OCI_DEFAULT); OCIDefineByPos(stmtp, &dfnp, errhp, 1, message, sizeof(message), SQLT_STR, 0, 0, 0, OCI_DEFAULT); OCIStmtExecute(svchp, stmtp, errhp, 1, 0, NULL, NULL, OCI_DEFAULT); while ( status == OCI_SUCCESS ) { printf("%sn", message); status = OCIStmtFetch2(stmtp, errhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT); } OCIHandleFree(stmtp, OCI_HTYPE_STMT); OCILogoff(svchp, errhp); OCIHandleFree(errhp, OCI_HTYPE_ERROR); return 0; }
コンパイル&リンク方法(Visua C++)
C:¥> SET INCLUDE=ORACLE_BASEORACLE_HOMEociinclude;%INCLUDE% C:¥> SET LIB=ORACLE_BASEORACLE_HOMEocilibmsvc;%LIB% C:¥> cl hello.c /link oci.lib
実行結果
Hello, OCI World!
-
Hello, ODBC(API) World!
Posted on 3月 21st, 2012 by cx20
ODBC(API)
ODBC(Open Database Connectivity)は、マイクロソフト社が提唱した DBMS 接続用の API 仕様である。
DBMS の差異は ODBC ドライバによって吸収される為、ODBC の手順にしたがってプログラムを作成すれば、基本的な差異を意識せず、プログラムすることができる。ODBCドライバ ファイル Microsoft Access Driver (*.mdb) ODBCJT32.DLL Microsoft Text Driver (*.txt; *.csv) ODBCJT32.DLL Microsoft Excel Driver (*.xls) ODBCJT32.DLL Microsoft dBase Driver (*.dbf) ODBCJT32.DLL Microsoft ODBC for Oracle MSORCL32.DLL Microsoft Paradox Driver (*.db ) ODBCJT32.DLL SQL Server SQLSRV32.DLL Microsoft Access Driver (*.mdb, *.accdb) ACEODBC.DLL SQL Server Native Client 10.0 SQLNCLI10.DLL ソースコード(VC + ODBC + Jet データベース)
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <sqlext.h> #include <sql.h> int _tmain( int argc, TCHAR* argv[] ) { HENV henv; HDBC hdbc; HSTMT hstmt; _TCHAR szConnStr[1024]; _TCHAR szConnOut[1024]; SQLSMALLINT cchConOut; _TCHAR szSQL[256]; SQLTCHAR szColName[128]; SQLSMALLINT nBufSize; SQLSMALLINT nSqlType; SQLULEN nColSize; SQLSMALLINT nScale; SQLSMALLINT nNullable; SQLTCHAR szMessage[256]; SQLLEN nMessageLen; SQLRETURN nReturn; _tcscpy( szConnStr, _T("Driver={Microsoft Access Driver (*.mdb)};DBQ=hello.mdb") ); _tcscpy( szSQL, _T("SELECT 'Hello, ODBC World!' AS Message") ); SQLAllocEnv( &henv ); SQLAllocConnect( henv, &hdbc ); SQLDriverConnect( hdbc, NULL, (SQLTCHAR*)szConnStr, _tcslen(szConnStr), (SQLTCHAR*)szConnOut, _countof(szConnOut), &cchConOut, SQL_DRIVER_NOPROMPT ); SQLAllocStmt( hdbc, &hstmt ); SQLExecDirect( hstmt, (SQLTCHAR*)szSQL, SQL_NTS ); SQLDescribeCol( hstmt, 1, (SQLTCHAR*)szColName, _countof(szColName), &nBufSize, &nSqlType, &nColSize, &nScale, &nNullable ); SQLBindCol( hstmt, 1, SQL_C_TCHAR, szMessage, _countof(szMessage), &nMessageLen ); while( TRUE ) { nReturn = SQLFetch( hstmt ); if( nReturn != SQL_SUCCESS && nReturn != SQL_SUCCESS_WITH_INFO ) { break; } _tprintf( _T("%sn"), szColName ); _tprintf( _T("------------------n") ); _tprintf( _T("%sn"), szMessage ); } SQLFreeStmt( hstmt, SQL_DROP ); SQLDisconnect( hdbc ); SQLFreeConnect( hdbc ); SQLFreeEnv( henv ); return 0; }
ソースコード(VC + ODBC + ACE データベース)
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <sqlext.h> #include <sql.h> int _tmain( int argc, TCHAR* argv[] ) { HENV henv; HDBC hdbc; HSTMT hstmt; _TCHAR szConnStr[1024]; _TCHAR szConnOut[1024]; SQLSMALLINT cchConOut; _TCHAR szSQL[256]; SQLTCHAR szColName[128]; SQLSMALLINT nBufSize; SQLSMALLINT nSqlType; SQLULEN nColSize; SQLSMALLINT nScale; SQLSMALLINT nNullable; SQLTCHAR szMessage[256]; SQLLEN nMessageLen; SQLRETURN nReturn; _tcscpy( szConnStr, _T("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=.\hello.accdb") ); _tcscpy( szSQL, _T("SELECT 'Hello, ODBC World!' AS Message") ); SQLAllocEnv( &henv ); SQLAllocConnect( henv, &hdbc ); SQLDriverConnect( hdbc, NULL, (SQLTCHAR*)szConnStr, _tcslen(szConnStr), (SQLTCHAR*)szConnOut, _countof(szConnOut), &cchConOut, SQL_DRIVER_NOPROMPT ); SQLAllocStmt( hdbc, &hstmt ); SQLExecDirect( hstmt, (SQLTCHAR*)szSQL, SQL_NTS ); SQLDescribeCol( hstmt, 1, (SQLTCHAR*)szColName, _countof(szColName), &nBufSize, &nSqlType, &nColSize, &nScale, &nNullable ); SQLBindCol( hstmt, 1, SQL_C_TCHAR, szMessage, _countof(szMessage), &nMessageLen ); while( TRUE ) { nReturn = SQLFetch( hstmt ); if( nReturn != SQL_SUCCESS && nReturn != SQL_SUCCESS_WITH_INFO ) { break; } _tprintf( _T("%sn"), szColName ); _tprintf( _T("------------------n") ); _tprintf( _T("%sn"), szMessage ); } SQLFreeStmt( hstmt, SQL_DROP ); SQLDisconnect( hdbc ); SQLFreeConnect( hdbc ); SQLFreeEnv( henv ); return 0; }
ソースコード(VC + ODBC + SQL Server)
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <sqlext.h> #include <sql.h> int _tmain( int argc, TCHAR* argv[] ) { HENV henv; HDBC hdbc; HSTMT hstmt; _TCHAR szConnStr[1024]; _TCHAR szConnOut[1024]; SQLSMALLINT cchConOut; _TCHAR szSQL[256]; SQLTCHAR szColName[128]; SQLSMALLINT nBufSize; SQLSMALLINT nSqlType; SQLULEN nColSize; SQLSMALLINT nScale; SQLSMALLINT nNullable; SQLTCHAR szMessage[256]; SQLLEN nMessageLen; SQLRETURN nReturn; _tcscpy( szConnStr, _T("Driver={SQL Server};SERVER=(local);DATABASE=master;UID=sa;PWD=P@ssW0rd") ); _tcscpy( szSQL, _T("SELECT 'Hello, ODBC World!' AS Message") ); SQLAllocEnv( &henv ); SQLAllocConnect( henv, &hdbc ); SQLDriverConnect( hdbc, NULL, (SQLTCHAR*)szConnStr, _tcslen(szConnStr), (SQLTCHAR*)szConnOut, _countof(szConnOut), &cchConOut, SQL_DRIVER_NOPROMPT ); SQLAllocStmt( hdbc, &hstmt ); SQLExecDirect( hstmt, (SQLTCHAR*)szSQL, SQL_NTS ); SQLDescribeCol( hstmt, 1, (SQLTCHAR*)szColName, _countof(szColName), &nBufSize, &nSqlType, &nColSize, &nScale, &nNullable ); SQLBindCol( hstmt, 1, SQL_C_TCHAR, szMessage, _countof(szMessage), &nMessageLen ); while( TRUE ) { nReturn = SQLFetch( hstmt ); if( nReturn != SQL_SUCCESS && nReturn != SQL_SUCCESS_WITH_INFO ) { break; } _tprintf( _T("%sn"), szColName ); _tprintf( _T("------------------n") ); _tprintf( _T("%sn"), szMessage ); } SQLFreeStmt( hstmt, SQL_DROP ); SQLDisconnect( hdbc ); SQLFreeConnect( hdbc ); SQLFreeEnv( henv ); return 0; }
ソースコード(VC + ODBC + Oracle)
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <sqlext.h> #include <sql.h> int _tmain( int argc, TCHAR* argv[] ) { HENV henv; HDBC hdbc; HSTMT hstmt; _TCHAR szConnStr[1024]; _TCHAR szConnOut[1024]; SQLSMALLINT cchConOut; _TCHAR szSQL[256]; SQLTCHAR szColName[128]; SQLSMALLINT nBufSize; SQLSMALLINT nSqlType; SQLULEN nColSize; SQLSMALLINT nScale; SQLSMALLINT nNullable; SQLTCHAR szMessage[256]; SQLLEN nMessageLen; SQLRETURN nReturn; _tcscpy( szConnStr, _T("Driver={Microsoft ODBC for Oracle};SERVER=ORCL;UID=scott;PWD=tiger") ); _tcscpy( szSQL, _T("SELECT 'Hello, ODBC World!' AS Message FROM DUAL") ); SQLAllocEnv( &henv ); SQLAllocConnect( henv, &hdbc ); SQLDriverConnect( hdbc, NULL, (SQLTCHAR*)szConnStr, _tcslen(szConnStr), (SQLTCHAR*)szConnOut, _countof(szConnOut), &cchConOut, SQL_DRIVER_NOPROMPT ); SQLAllocStmt( hdbc, &hstmt ); SQLExecDirect( hstmt, (SQLTCHAR*)szSQL, SQL_NTS ); SQLDescribeCol( hstmt, 1, (SQLTCHAR*)szColName, _countof(szColName), &nBufSize, &nSqlType, &nColSize, &nScale, &nNullable ); SQLBindCol( hstmt, 1, SQL_C_TCHAR, szMessage, _countof(szMessage), &nMessageLen ); while( TRUE ) { nReturn = SQLFetch( hstmt ); if( nReturn != SQL_SUCCESS && nReturn != SQL_SUCCESS_WITH_INFO ) { break; } _tprintf( _T("%sn"), szColName ); _tprintf( _T("------------------n") ); _tprintf( _T("%sn"), szMessage ); } SQLFreeStmt( hstmt, SQL_DROP ); SQLDisconnect( hdbc ); SQLFreeConnect( hdbc ); SQLFreeEnv( henv ); return 0; }
ソースコード(VC + ODBC + MySQL)
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <sqlext.h> #include <sql.h> int _tmain( int argc, TCHAR* argv[] ) { HENV henv; HDBC hdbc; HSTMT hstmt; _TCHAR szConnStr[1024]; _TCHAR szConnOut[1024]; SQLSMALLINT cchConOut; _TCHAR szSQL[256]; SQLTCHAR szColName[128]; SQLSMALLINT nBufSize; SQLSMALLINT nSqlType; SQLULEN nColSize; SQLSMALLINT nScale; SQLSMALLINT nNullable; SQLTCHAR szMessage[256]; SQLLEN nMessageLen; SQLRETURN nReturn; _tcscpy( szConnStr, _T("Driver={MySQL ODBC 5.1 Driver};Server=localhost;UID=root;PWD=P@ssW0rd") ); _tcscpy( szSQL, _T("SELECT 'Hello, ODBC World!' AS Message") ); SQLAllocEnv( &henv ); SQLAllocConnect( henv, &hdbc ); SQLDriverConnect( hdbc, NULL, (SQLTCHAR*)szConnStr, _tcslen(szConnStr), (SQLTCHAR*)szConnOut, _countof(szConnOut), &cchConOut, SQL_DRIVER_NOPROMPT ); SQLAllocStmt( hdbc, &hstmt ); SQLExecDirect( hstmt, (SQLTCHAR*)szSQL, SQL_NTS ); SQLDescribeCol( hstmt, 1, (SQLTCHAR*)szColName, _countof(szColName), &nBufSize, &nSqlType, &nColSize, &nScale, &nNullable ); SQLBindCol( hstmt, 1, SQL_C_TCHAR, szMessage, _countof(szMessage), &nMessageLen ); while( TRUE ) { nReturn = SQLFetch( hstmt ); if( nReturn != SQL_SUCCESS && nReturn != SQL_SUCCESS_WITH_INFO ) { break; } _tprintf( _T("%sn"), szColName ); _tprintf( _T("------------------n") ); _tprintf( _T("%sn"), szMessage ); } SQLFreeStmt( hstmt, SQL_DROP ); SQLDisconnect( hdbc ); SQLFreeConnect( hdbc ); SQLFreeEnv( henv ); return 0; }
コンパイル&リンク方法(Visual C++)
C:¥> cl hello.c /link odbc32.lib
実行結果
Message ------------------ Hello, ODBC World!