1

共有ライブラリ (.so) からクラス シンボルにアクセスしたいのですが、これは正しい方法ですか?

MyClass* pMyClass= (MyClass*)dlsym(phandle, "MyClass");

これが正しい方法であれば、キャスト用の MyClass ヘッダーが必要です。ヘッダーを含めずにこれを行う方法が他にあるかどうか知りたいですか?

ありがとう

4

2 に答える 2

1

ご存知のように、dlsym は基本的に、型指定さvoid *れていないポインターを返します。

そのポインタはシンボルのアドレスです - 単なる数字です。あなたが持っている場合

class MyClass instance;

.so では、dlsym は の値を返します&instance。そこには他の情報はありません。Toはdlsyminstanceメモリ領域の単なるアドレスです。もしあなたが持っていたら

char instance[sizeof(MyClass)]

まったく同じ値が得られます。

したがって、あなたの質問に答えるために-いいえ、アドレスdlsymが返されるシンボルの内容についての知識はありません。その知識を自分で追加する必要があります。そのため、結果をキャストdlsymする必要があり、ヘッダー ファイルをインクルードする必要があります。

于 2013-03-22T12:43:28.033 に答える
1

取得できるシンボルはdlsym、メモリ内の何か (オブジェクトまたは関数) に対応するものだけです。クラスの名前はどちらでもありません。クラス型のオブジェクトへのポインターを取得できますが、どこかにヘッダーがないと、それを使用して何もできません (クラス型に名前を付けることさえできません)。( を実行する時点でクラスの前方定義を使用できます dlsymが、不完全な型へのポインターでできることは何もないため、これはあまり役に立ちませんvoid*。)

于 2013-03-22T12:44:17.823 に答える