һ�������� Hello World �ͻ�����

���⴦��������� C ӳ��

ֱ�����ڣ�������ʾ�����еĴ���Ƭ���У��� CORBA_exception_init ���õĸ�������һЩ CORBA_Environment ����... �����ǿ�һ����Щ�����Ǹ�ʲô�õİɡ�

����ûʲô�µĶ���: C ���Բ�֧�����⴦��������뽨��һ��������ϵͳ��֧���źź����ƵĶ���(��һ�� GTK+ �ź�ϵͳ)��CORBA ��������һ��ϵͳ������ʹ���������򵥵ġ� ÿ����������һ�� CORBA_Environment * �������ڴ洢��������ݡ������һ������ִ���ڼ�����(raise)�����⣬���ⷢ������ʵ���������ݽ����洢������ṹ�С��������һ����

typedef struct CORBA_Environment {

        CORBA_exception_type _major;

        /* .... */
        
} CORBA_Environment;

_major �ֶ�ָʾ�ڷ��������ڼ��Ƿ�������һ�����⡣�������� 3 ��ֵ: CORBA_NO_EXCEPTION�� CORBA_USER_EXCEPTION �� CORBA_SYSTEM_EXCEPTION�����ǵ���˼������� ���͵ģ����õĴ���Ӧ����ÿ����������֮������Ƿ���������(��Ϊ�쳣����Щ)��

CORBA_Environment ev;

if (ev->_major == CORBA_NO_EXCEPTION)
        /* goooood :) */
else
        /* baaaaad :( */
      

������һϵ�к���������Щ�����ϵIJ��������ǿ����� CORBA_exception_set ����(throw)���⡣CORBA_exception_id ������������ı�ʶ�����һ���ַ�����CORBA_exception_value ����һ��������ṹ��ָ�룬CORBA_exception_free ������һ������֮�����³�ʼ��һ�� ev �ṹ�����������ǵIJ���˵����

extern CORBA_char *CORBA_exception_id (CORBA_Environment *ev);

extern void *CORBA_exception_value (CORBA_Environment *ev);

extern void CORBA_exception_free (CORBA_Environment *ev);

extern void CORBA_exception_set (CORBA_Environment *ev, 
                                CORBA_exception_type major,
                                CORBA_char *exception_id,
                                void *parameters);
      

������ʹ����ǰ3��������һ���������룺

// ��������������ʵĽӿ�
module FruitsBasket {
interface Apple {
        exception eaten {
                string<40> why;
        };
        void EatMe () raises (eaten);  
};
};
#include <orb/orbit.h>
/* �����Ƿ��ʽӿڵĴ��� */
int main (int argc, char *argv)
{
        CORBA_Object obj;
        CORBA_Environment ev;
        CORBA_ORB orb;

        CORBA_exception_init (&ev);
        orb = CORBA_ORB_init (&ev);

        if (ev->_major != CORBA_NO_EXCEPTION) {
                fprintf (stderr, 
                         "Error: unable to initialize the ORB: %s\n", 
                         CORBA_exception_id (&ev));
                CORBA_exception_free (&ev);
                exit (1);
        } 

        /* ���� Apple ����Ĵ��� */

        /* ע��ʹ�� switch /case �����ܸ�����һЩ
         * ������������������� ...
         */
        FruitsBasket_Apple_EatMe (orb, &ev);
        if (ev->_major != CORBA_NO_EXCEPTION) {
                if (ev->_major == CORBA_USER_EXCEPTION) {
                        CORBA_char *buffer;
                        buffer = CORBA_exception_id (&ev);
                        if (strcmp (buffer, "FruitsBasket_Apple_eaten")) {
                                fprintf (stderr, 
                                         "user exception: Apple already eaten: %s\n", 
                                         (CORBA_exception_value (&ev))->why);
                                exit (1);
                        } else {
                                fprintf (stderr, 
                                         "unknown exception raised!! Error!!\n");
                                exit (2);
                        } 
                } else {
                        fprintf (stderr, 
                                 "System exception: %s\n", 
                                 CORBA_exception_id (&ev));
                        exit (1);
                }
        }
        return 0;
}

���������Ĵ������������⣬��������ȷ�IJ������ݸ�  CORBA_exception_set�� CORBA_exception_type ������ CORBA_USER_EXCEPTION �� CORBA_SYSTEM_EXCEPTION ����֮һ�� CORBA_char ��������ͷ�ļ��� #define ����������֣� void * ��һ��������ṹ��ָ�룬����ṹ���ֶ��Ѿ�����䣬����ṹ���ڴ����� __alloc() ����ġ�������ʹ�� Apple �����һ��С���ӣ�

/* �����ڷ������в���������Ҫ���� "eaten" ���� 
 * ��������ȷ��ԭ��"why"
 * ע�����ǵ� Apple �������⽫��ӳ�����������ݽṹ��
 * /
typedef struct FruitsBasket_Apple_eaten {
        CORBA_char why[40];

        /* ... ���ϸ��ָ������ض���ʵ�ֵij�Ա */

} FruitsBasket_Apple_eaten;
#define ex_FruitsBasket_Apple_eaten <identifier>
FruitsBasket_Apple_eaten *FruitsBasket_Apple_eatme__alloc ()
*/
FruitsBasket_Apple_eaten *exception;

exception = FruitsBasket_Apple_eaten__alloc ();

strcpy (exception->why, "mmmm...");

CORBA_exception_set (&ev, CORBA_USER_EXCEPTION,
                        ex_FruitsBasket_Apple_eaten,
                        (void *) exception);
      

ע���˵Ĵ���

�������⴦���������Ѿ�û��ʲô�����ˣ�����Ժ����׵IJ鿴 hello world �Ĵ��롣����ʹ������Ľӿڶ��壺 

interface Echo {
        void echo (in string<40> str);
};
      

������Դ����:

main () 
{
        CORBA_ORB orb;
        CORBA_Environment ev;
        CORBA_Object obj;
        FILE *file;
        /* һ���dz������ַ���: �������������е���Ҫ :) */
        char buffer[10000]; 
        char *ior;

        CORBA_exception_init(&ev);
        orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", &ev);
        if (ev->_major != CORBA_NO_EXCEPTION) {
                fprintf (stderr, 
                         "Error: exception during ORB init: %s\n", 
                         CORBA_exception_id(&ev));
                exit (1);
        }

        if (!file = fopen ("object.ior", "r")) {
                fprintf (stderr, 
                         "error: could not open serializing file\n");
                exit (2);
        }

        fgets (buffer, 10000, file);
        ior = g_strdup (buffer); /* �õ�ԭʼ���ַ��� */

        /* ����, ��������ӵ������ !! */
        obj = CORBA_ORB_string_to_object (orb, ior, &ev);
        if (ev->_major != CORBA_NO_EXCEPTION) {
                fprintf (stderr, 
                         "Error: could not get object reference: %s\n", 
                         CORBA_exception_id(&ev));
                exit (3);
        }
        fclose (file);

        Echo_echo (obj, ,&ev);
        if (ev->_major != CORBA_NO_EXCEPTION)
                fprintf (stderr, 
                         "Error: could not get method: %s\n", 
                         CORBA_exception_id(&ev));

        CORBA_exception_free(&ev);

        /* ����, ���ǿ��Ե�����������... */
}

��ʵ�ϣ���Щ��������ǰ�����������ģ�ֻ�����������⴦����