以下のようなプログラムを実現したいのですが、うまくいっておりません。
ご指摘やアドバイスをいただけると幸いです。
ソースは簡略化して、要所のみ記載しておりますが、不足があれば追記します。
--------------------------------------------------
■dll(下記のA~Cをまとめて、ひとつのDLLとしています)
◇既存プログラムA(本PGのソースは極力変更しない。Native C)
typedef struct {
char Id[4] = "";
char Name[16] = "";
} SendData;
typedef struct {
char *result;
int result_len;
} ResultData;
int Send(SendData*sd, ResultData*rd){
~ データ処理を記述 ~
※ sdのデータを用いて、rdに結果を格納する
}
----------
◇新規プログラムB(クラス→構造体するためのデータクラス。VC++.Net)
namespace ServiceA {
public ref class DataClass{
public:
DataClass(String^ Id, String^ Name){
SendData sd0;
ResultData rd0;
strcpy_s(sd0.Id, StringCharConvert::String2Char(Id));
strcpy_s(sd0.Name, StringCharConvert::String2Char(Name));
sd= &sd0;
rd= &rd0;
return;
}
~FcSendData() {}
String^ getResult(){
return StringCharConvert::Char2String(rd->result);
}
int getResult_len(){
return rd->result_len;
}
SendData *sd;
ResultData *rd;
};
}
※StringCharConvertは名前の通りString型とchar型文字列を変換する関数として用意しています。
----------
◇新規プログラムC(Native Cとデータを授受するためのクラス。VC++.Net)
namespace ServiceA {
public ref class ServiceCall{
public:
FcServiceCall() {}
~FcServiceCall() {}
int SendData(DataClass^ dc){
return Send(dc->sd, dc->rd);
}
};
}
--------------------------------------------------
■新規プログラムD(上記dllを利用するPG。VB.Net)
Dim SD00 As New ServiceA.DataClass("12", "test")
Dim SC00 As New ServiceA.ServiceCall
resultcode = SC00.SendData(SD00)
result = SD00.getResult()
result_len = SD00.getResult_len()
--------------------------------------------------
このプログラムを実行した際に、
・rdにNative Cで代入した結果は、プログラムDにて参照できています(getResultなどは正常)
が、
・sdに格納したデータを、Native Cで参照できない
という状況が発生しています。
デバッグにより、sdに格納したデータが、プログラムB時点(コンストラクタ)では、ちゃんと見えていますが、プログラムCでの引き渡しでうまく引渡せていないように思われます。
また、当然ですが、プログラムAでも、sdに格納されたデータは見れておりません。
かなり悩んだのですが、原因と改善策が見つけられず。
もし、分かる方がいれば、ご指摘いただけると助かります。
よろしくお願いいたします。
※ 環境情報
OS:Windows7 SP1
IDE:Visual Studio 2015
No.1ベストアンサー
- 回答日時:
C/C++はともかく.Net系は理解が怪しいので勘違いしているかもしれませんけど・・・
sd0,rd0はDataClassコンストラクタのローカル変数ですよね。
そのアドレスをインスタンス変数に代入しても、実体はコンストラクタを出た時点で破棄されるので、懸垂参照となり意味がありません。
sd,rdの実体はコンストラクタの中で明示的にnewし、デストラクタで明示的にdeleteする必要があるでしょう。
あるいは、sd,rdをDataClass内に実体変数として定義します。
ご指摘ありがとうございます。
まさに、その通りでした…
完全に見落としていました。
newしたら、普通にOKとなりました。
早急な回答ありがとうございます!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムの規模を表す単位「k...
-
ステップ数について
-
ステップカウントツールが作成...
-
STEPについて
-
ubuntuで デイスク/deb/loopと...
-
パソコンでインターネット接続...
-
同じサブネットに属するIPアドレス
-
リユーザブル,リエントラント...
-
最大スタックサイズを大きくす...
-
ネットワークアイコンが黄色三...
-
hdmiはパラレル?シリアル?
-
ブロック長について
-
gccでスタックサイズを変更する...
-
VC++6.0 Stack Overflow !!
-
[ASP]If~Else If~End If 対 Case
-
VB.netでDLLを読み込んで実行す...
-
タッチタイプの拗音が苦手です...
-
JDBCでのトランザクション・排...
-
エクセルのHLOOKUP関数の検索範...
-
コンパクションとガーベジコレ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムの規模を表す単位「k...
-
ライン数とステップ数の違いに...
-
ステップ数について
-
STEPについて
-
ドット絵のようなやつを作るに...
-
VB6.0で #の意味
-
Octaveでのオイラー法とルンゲ...
-
ステップ数によるスケジュール
-
「ByRef引数の型が一致しません...
-
ステップカウントツールが作成...
-
prologでNの階乗の逆関数を考...
-
現在時刻の取得
-
シェルスクリプトについて
-
ステップ数??
-
プログラムで 一番大きい を定...
-
三菱シーケンサ FX2Nについて
-
再帰について
-
PythonのプログラムのDirに関す...
-
繰り返しの続き、黄金比
-
ショートカットキーに関して
おすすめ情報