Archive for the ‘C言語’ Category

  1. 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!                      |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  2. 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!                     |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  3. 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!                   |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  4. 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, &param, &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] |
    +----------------------------------------+
  5. 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   
    ---------------------------
  6. 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   
    ---------------------------
  7. 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   
    ---------------------------
  8. 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!
  9. 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!
  10. 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!