アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のようなプログラムを実現したいのですが、うまくいっておりません。
ご指摘やアドバイスをいただけると幸いです。

ソースは簡略化して、要所のみ記載しておりますが、不足があれば追記します。
--------------------------------------------------
■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

A 回答 (1件)

C/C++はともかく.Net系は理解が怪しいので勘違いしているかもしれませんけど・・・



sd0,rd0はDataClassコンストラクタのローカル変数ですよね。
そのアドレスをインスタンス変数に代入しても、実体はコンストラクタを出た時点で破棄されるので、懸垂参照となり意味がありません。
sd,rdの実体はコンストラクタの中で明示的にnewし、デストラクタで明示的にdeleteする必要があるでしょう。
あるいは、sd,rdをDataClass内に実体変数として定義します。
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。
まさに、その通りでした…
完全に見落としていました。
newしたら、普通にOKとなりました。
早急な回答ありがとうございます!!

お礼日時:2016/12/02 18:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!