Archive for the ‘Objective-C’ Category

  1. Hello, COM(Objective-C) World!

    Posted on 3月 16th, 2013 by cx20

    COM(Objective-C)

    COM(Component Object Model)はマイクロソフトの提唱するプログラム部品の仕様である。
    COM を用いて開発された部品であれば言語を問わず利用することができる。
    以下は MinGW 版 Objective-C による COM クライアントの例となっている。

    ソースコード

    #import <windows.h>
    #import <ole2.h>
    #import <objc/Object.h>
     
    @interface Hello : Object
    - (void) sayHello;
    @end
     
    @implementation Hello
    - (void) sayHello {
        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();
    }
    @end
     
    int main(int argc, char *argv[]) {
        id obj = [ Hello alloc ];
        [ obj sayHello ];
     
        return 0;
    }

    実行方法

    C:¥> gcc -o hello hello.m -l objc -l ole32  -l oleaut32 -l uuid

    実行結果

    +----------------------------------------+
    |Browse For Folder                    [X]|
    +----------------------------------------+
    | Hello, COM(Objective-C) Wolrd!         |
    |                                        |
    | +------------------------------------+ |
    | |[Windows]                           | |
    | | +[addins]                          | |
    | | +[AppCompat]                       | |
    | | +[AppPatch]                        | |
    | | +[assembly]                        | |
    | |     :                              | |
    | |     :                              | |
    | |     :                              | |
    | +------------------------------------+ |
    | [Make New Folder]    [  OK  ] [Cancel] |
    +----------------------------------------+
  2. Hello, Win32 API(Objective-C) World!

    Posted on 3月 12th, 2013 by cx20

    Win32 API(Objective-C)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は MinGW 版 Objective-C による呼出し例である。

    ソースコード

    #import <windows.h>
     
    int main( int argc, char* argv[] )
    {
        MessageBox( NULL, "Hello, Win32 API World!", "Hello, World!", MB_OK );
        return 0;
    }

    コンパイル方法(MinGW Objective-C)

    C:¥> gcc -o hello hello.c -l objc

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API World!
    ---------------------------
    OK   
    ---------------------------
  3. Hello, Objective-C World!

    Posted on 12月 5th, 2011 by cx20

    Objective-C

    Objective-C は C言語に Smalltalk の概念を組み合わせたような言語である。
    C言語の上位互換ではあるが、独自のコンパイラディレクティブや [] によるメッセージ式など、C++ プログラマからすると特殊に見える為、取っ付きにくい言語と言われている。
    主に、Apple の Mac OS X や iOS のアプリ開発に利用されている。

    ソースコード

    #import <Foundation/Foundation.h>
     
    @interface HelloWorld : NSObject
    {
    }
    - (void) sayHello;
    @end
     
    @implementation HelloWorld
    - (void) sayHello
    {
        NSLog( @"Hello, Objective-C World!" );
    }
     
    @end
     
    int main( int argc, char* argv[] )
    {
        id hw = [HelloWorld alloc];
        [hw sayHello];
        return 0;
    }

    コンパイル方法(Objective-C)

    $ gcc -o hello hello.m -lobjc -framework Foundation

    実行結果

    2011-12-05 01:20:43.624 hello[24302:707] Hello, Objective-C World!