HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0324
とあるプログラマ(DLL開発) DLL側のクラスのインスタンス作成2解決


とあるプログラマ

リンク

2020/3/24(Tue) 12:38:14|NO.89807

C++によるHSP3用DLL開発についてです。

クラスを作成しDLLで実装、HSP3でインスタンス作成としたいのですが、HSP3側で呼び出す(作成する)方法が分かりません。
あまり詳しくはないのですが、パっと思いついた方法は

1)DLL内でクラスインスタンス作成する関数も作る
2)COMオブジェクト型変数で呼び出せるようにする

の2通りなのですが、
前者の場合は関数内でインスタンスを作成してもローカルとして関数終了時に破棄されるので関数をまたいだ使用ができない。インスタンスを作成してもHSP3側にはインスタンスのハンドルを返す程度しかできなく、その場合HSP3側から呼び出す関数でハンドルを渡したところでどうメソッドを呼び出すのか。
後者の場合はCOMとして呼び出せるDLLの開発方法

が分からない状況です。
HSP3側で呼び出せるクラスについておおまかでも開発手順が分かりましたら教えていただきたいです。



この記事に返信する


リンク

2020/3/24(Tue) 13:48:54|NO.89808

簡単な方法はこんな感じです。面倒ですが!

#cfunc createObject "createObject" #func execClassMethodA "execClassMethodA" int//パラメータなし #cfunc execClassMethodB "execClassMethodB" int, int, int//パラメータ2つとか、で、戻り値ももらう #func releaseObject "releaseObject" int
hspのほうでこうしておいて、

#define dll extern "C" __declspec(dllexport) dll object * createObject(){ object *obj = new object(); return obj; } dll void execClassMethodA(object *obj){ obj->classMethodA(); } dll int execClassMethodB(object *obj, int param1, char *param2){ return obj->classMethodB(param1,param2); } dll void releaseObject(object *obj){ delete(obj); return; }
という感じにして使います。
もし、もうちょっと手間を減らしたければ、 execClassMethodを1個だけにして、文字列を渡すようにして、その文字列をswitch文に入れて…とか。こうすると、 func cfunc を書く作業を省略できます。
モジュール変数を使っても色々できそうですが、私はモジュール変数を使ったことがないのでよくわかりません。



とあるプログラマ

リンク

2020/3/25(Wed) 11:42:08|NO.89826

>>猫さん

ありがとうございます。望み通りの動作ができました。



ONION software Copyright 1997-2023(c) All rights reserved.