1

私はそのようなコードを持っています:

interface Employee
{
    string getLastname();
};

#include "Employee.idl"

interface Work
{
    Employee getEmployee(in short id);
};

サーバーファイル:

#include "Employee.hh"

class EmployeeImpl : public POA_Employee
{
    private:
        char* lastname;
        int id;

    public:
        EmployeeImpl(const char* lastname, int id);
        char* getLastname();
};

#include "EmployeeImpl.h"

EmployeeImpl::EmployeeImpl(const char* lastname, int id)
{
    this->lastname = const_cast<char*>(lastname);
    this->id = id;
}

char* EmployeeImpl::getLastname()
{
    return this->lastname;
}

#include "Work.hh"
#include <vector>
#include "EmployeeImpl.h"
using namespace std;

class WorkImpl : public POA_Work
{
    private:
        vector<EmployeeImpl> employees;

    public:
        WorkImpl();
        Employee_ptr getEmployee(::CORBA::Short id);
};

#include "WorkImpl.h"

 WorkImpl::WorkImpl()
 {
    EmployeeImpl ei1("Doe", 1);
    EmployeeImpl ei2("Smith", 2);
    EmployeeImpl ei3("Brown", 3);

    employees.push_back(ei1);
    employees.push_back(ei2);
    employees.push_back(ei3);
 }

Employee_ptr WorkImpl::getEmployee(::CORBA::Short id)
{
    return employees[id]._this();
}

クライアント ファイル:

import java.util.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import java.io.*;

public class Client
{
    public static void main(String [] args)
    {
     try
     {
        org.omg.CORBA.ORB clientORB = org.omg.CORBA.ORB.init(args, null);

        if (clientORB == null)
        {
            System.out.println("Problem while creating ORB");
            System.exit(1);
        }

        org.omg.CORBA.Object objRef = clientORB.resolve_initial_references("NameService");
        NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

        Work work = WorkHelper.narrow(ncRef.resolve_str("WorkService"));
        Employee e = work.getEmployee((short)1);
        System.out.println(e.getLastname());
            e = work.getEmployee((short)2);
            System.out.println(e.getLastname());
            e = work.getEmployee((short)3);
            System.out.println(e.getLastname());

        }catch(Exception e){ System.out.println(e.getMessage()); }
    }
}

クライアント側でサーバー、次にクライアントを実行すると、次のように表示されます。

スミス

それ以外の:

Doe
Smith
Brown

クライアントがメッセージを受け取ったとき、サーバー側で次のように表示されます。

セグメンテーション違反 (ダンプされたコピー)

そしてサーバークラッシュ。私のコードの何が問題なのですか? Kubuntu では omniORB と idlj を使用し、g++ と javac を使用してファイルをコンパイルします。

Heres私のプロジェクト全体: http://www44.zippyshare.com/v/60244821/file.html

4

1 に答える 1

5

パラメータの受け渡しに関するIDLからC++へのマッピングルールに従っていません。特に、サーバーでは:

char* EmployeeImpl::getLastname()
{
    return this->lastname;   // this is the problem
}

CORBA::string_freeスケルトンコードは、ネットワークを介してクライアントにマーシャリングした後、動的に割り当てられたメモリを(で)割り当て解除するため、動的に割り当てられたメモリを返す必要があります。

これは次のようになります。

char* EmployeeImpl::getLastname()
{
    return CORBA::string_dup(this->lastname);
}

これはすべて、Henning&Vinowskiの本Advanced CORBA Programming withC++で説明されています。

あなたが抱えている他の問題は、1ベースのインデックスでベクトルにインデックスを付けていることです。ただし、vectorは0ベースのインデックススキームを使用します。これを修正するには、クライアント呼び出しを変更するか、サーバーの実装を次のように変更します。

Employee_ptr WorkImpl::getEmployee(::CORBA::Short id)
{
    if (id >= 1 && id <= employees.size())
    { 
       return employees[id - 1]._this();  // convert to 0-based indexing
    }
    else
    {
       // throw some type of exception
    }
}
于 2012-09-05T20:19:10.910 に答える