以下のようなプログラムを実現したいのですが、うまくいっておりません。
ご指摘やアドバイスをいただけると幸いです。
ソースは簡略化して、要所のみ記載しておりますが、不足があれば追記します。
--------------------------------------------------
■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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- USBメモリー・SDカード・フラッシュメモリー 任天堂スイッチのSDカードについて SDカードの容量がいっぱいなので、新しくSDカードを買って、任天 3 2023/04/06 13:09
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ライン数とステップ数の違いに...
-
プログラムの規模を表す単位「k...
-
ステップ数について
-
シェルスクリプトについて
-
剰余を求めるプログラム
-
hdmiはパラレル?シリアル?
-
[ASP]If~Else If~End If 対 Case
-
パソコンでインターネット接続...
-
ubuntuで デイスク/deb/loopと...
-
VB.netでDLLを読み込んで実行す...
-
最大スタックサイズを大きくす...
-
昔したタイピングソフトが思い...
-
ホストアドレスの0とは
-
SP領域とはなんですか?
-
関数のプロローグとエピローグ...
-
_CRTIMPの意味は?
-
Ic-PcAn はどこのこと?
-
GCCで関数の引数が渡らない
-
AutoCAD LTの中古。
-
ネットワークアドレスとブロー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムの規模を表す単位「k...
-
ライン数とステップ数の違いに...
-
ステップ数について
-
ステップ数??
-
ステップカウントツールが作成...
-
VB6.0で #の意味
-
STEPについて
-
シェルスクリプトについて
-
基本情報技術者の擬似言語プロ...
-
現在時刻の取得
-
三菱シーケンサ FX2Nについて
-
ドット絵のようなやつを作るに...
-
プログラムで 一番大きい を定...
-
プログラムから追加したドロッ...
-
c言語プログラミングのプログラ...
-
パソコンでインターネット接続...
-
ubuntuで デイスク/deb/loopと...
-
Macと iPadの違いについて 今現...
-
命令口調について
-
VB.netでDLLを読み込んで実行す...
おすすめ情報