C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 127 を表示中)
■75362 / )  Re[9]: VB.netからVC++6.0のへの構造体配列
□投稿者/ Azulean (453回)-(2015/03/18(Wed) 22:14:29)
2015/03/19(Thu) 07:19:40 編集(投稿者)

No75357 (とら さん) に返信
> 前述した通り、当方にはVC++に関する知識が殆ど御座いませんので、VC++のお勉強をして下さいというご指摘でしたら
> 大変申し上げ難いのですが、今回はあまり時間的な余裕が御座いませんのでまた別の機会にしたく考えております。

ビジネスですか?趣味ですか?学術的なものですか?
趣味や研究、学問の範囲であればその判断に異議を唱えるつもりはありません。
しかし、ビジネスであるのであれば、再考を提案します。


C/C++ は VB6/VB.NET に比べるとかなり難しい領域です。
いかようにも書けてしまうため、サンプルコード単独では正しくとも、周囲のソースコードと組み合わせたらまずいケースもあり得ます。
ソースコードを理解し、適切な対応をとるための準備ができないのであれば、C/C++ を修正するという考えは捨てた方がいいと断言できるぐらいです。


私が選択肢を考えるとすれば…

(1)C/C++ 経験のある熟練した開発者を助っ人に頼む
(2)リスクを説明し、「VB6 を捨てる」という方針を緩和してもらい、問題の部分だけ VB6 でラップする。
(3)リスクを説明し、十分な学習時間・検証時間をとる
(4)リスクを説明し、リーダーや上長に責任を持ってもらう(責任転嫁)

でしょうか。

「第三者がそんな強権的な発言するな」と思われるかもしれません。

ソフトウェア開発業界で仕事している立場からすると、今のまま進めたら、後で悲惨な未来が待っているかもしれないことを危惧しております。
納期ばかり気にするのではなく、修正したソースコードで不具合が出たら誰が責任を負うのか、提供先で不具合が出たときの損害額はいかほどか、そのとき自分はどんな立場に立たされるのか、責任追及されるのか、それらの発生確率・影響をご考慮いただければ幸いです。


------

> TestSub_API int __stdcall FuncTestSub (void *Type1);

SafeArrayAccessData で得た構造体配列の先頭ポインタを渡しているだけであれば、SafeArray の要素数が変わることはないと思っています。
予想できる振る舞いとしては、内容の書き換えぐらいまでですかね。

いずれにせよ、どのように修正するべきかは、FuncTestSub の実装とその呼び出し側のロジック次第です。
全体を見通せない第三者では、正解を示せない可能性があることをご了承ください。

(手元にソースコードがあっても、レガシーコードを触るのに十数時間から数十時間の調査・検討を重ねてやっと修正できるようなことも現実的にある世界です。。。)

----
以下推測(まったく保障のない、私の勝手な予想に過ぎません)

"TestSub_API int __stdcall FuncTestSub (void *Type1)" なら、渡した先で構造体のポインタにキャストしていると予想される。
呼び出し元で事前にキャストしていないことから、先頭ポインタを渡すことを前提としているはず。
であれば、要素数を渡さないこの関数のシグネチャからは要素数は一定以上、事実上固定のサイズと想定していそう。
そうであれば、固定長の C 形式配列を渡すように関数を書き換え、不要となった SafeArray 系のコードを整理し、P/Invoke 側も書き換えればいけそうではある。
予想もつかない突飛な実装をしていない限り…。
返信 編集キー/


管理者用

- Child Tree -