共有ライブラリ (.so) からクラス シンボルにアクセスしたいのですが、これは正しい方法ですか?
MyClass* pMyClass= (MyClass*)dlsym(phandle, "MyClass");
これが正しい方法であれば、キャスト用の MyClass ヘッダーが必要です。ヘッダーを含めずにこれを行う方法が他にあるかどうか知りたいですか?
ありがとう
ご存知のように、dlsym は基本的に、型指定さvoid *
れていないポインターを返します。
そのポインタはシンボルのアドレスです - 単なる数字です。あなたが持っている場合
class MyClass instance;
.so では、dlsym は の値を返します&instance
。そこには他の情報はありません。Toはdlsym
、instance
メモリ領域の単なるアドレスです。もしあなたが持っていたら
char instance[sizeof(MyClass)]
まったく同じ値が得られます。
したがって、あなたの質問に答えるために-いいえ、アドレスdlsym
が返されるシンボルの内容についての知識はありません。その知識を自分で追加する必要があります。そのため、結果をキャストdlsym
する必要があり、ヘッダー ファイルをインクルードする必要があります。
取得できるシンボルはdlsym
、メモリ内の何か (オブジェクトまたは関数) に対応するものだけです。クラスの名前はどちらでもありません。クラス型のオブジェクトへのポインターを取得できますが、どこかにヘッダーがないと、それを使用して何もできません (クラス型に名前を付けることさえできません)。( を実行する時点でクラスの前方定義を使用できます
dlsym
が、不完全な型へのポインターでできることは何もないため、これはあまり役に立ちませんvoid*
。)