• ベストアンサー

VB6.0の関数をC++で使いたい

いまVB6.0のRATE関数をC++で使いたいと考えています。 自分なりに調べてVB6.0でActiveX DLLを作ってみたりしたのですができませんでした。 また、RATE関数と同じ動きをするC++の関数も見当たらず困っています。 どなたかVB6.0の関数をC++で使えるようにする方法か、 RATE関数と同じ動きをするC++の関数をご存知のかたがいましたら教えてください。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.5

_clsRatePtr serv; これは COMサーバーへのポインタ宣言だと思います VB6側で作成した COMクラスのことです _は Cの場合よく付加される修飾ですよね #import ディレクティブの宣言が上手くいっていないのかも …

vBvCBug
質問者

お礼

大変参考になりました。 ありがとうございました。

vBvCBug
質問者

補足

申し訳ありません。 原因は、VBでのDLL作成でのミスでした。 それを修正したことでC++での呼び出しは行うことができました。 本当にありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

>支払額が不明な場合の計算式 なるほど。。。 >それともいま作っているプログラムとは別に*.cppで >DLL(DLL2とします)を作ってDLL2をいま作っているプログラムで >呼び出すようにすればいいのでしょうか? Cだとこれがいいでしょう。 No3さんも指摘していますが、CoInitializeは スレッド毎に呼び出す必要がありますので、スレッドの アパートメントを考えれば、CoInitializeはDLLの呼び出し側で DLLの関数を使用する前にコールするのが良いと思います。 DLL側からではスレッド毎にCoInitializeとCoUninitializeを 制御する方法が無いためです。 基本的にはプロセスの開始と終わりでそれぞれコールすれば良いかと。 #COMを使用する関数内に閉じれば出来ない事はありませんが、 #呼び出しすぎるとCoInitializeがエラーを返したりするうえ、 #DLLエントリからの呼び出しはMSが禁止していた気がします。

vBvCBug
質問者

お礼

大変参考になりました。 ありがとうございました。

vBvCBug
質問者

補足

CoInitializeとCoUninitializeを*.Cで作っているほうに書くということでしょうか? *.CでCoInitializeとCoUninitializeを行い、*.CPPで作成したDLLを呼び出す。 *.CPPで作成したDLLからVBで作成したDLLを呼び出す。 以上のような流れのイメージで合っていますでしょうか?

すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

Cでとなると クラスが使えないのでつらいでしょうね VBとのインターフェースにC++で作ったDLLをかませてってことになると思いますよ AtlBase.hはCComVariantを使うためなので バリアント型の引数をやめてしまって全部doubleにしちゃうとか WINAPI側の VARIANT構造体で書き直すとかかなぁ でも COM関連のイニシャライズとかが問題になるかも 外部に公開する関数は Cリンケージ(extern "C"で修飾)にしておいてやれば良いように思います

vBvCBug
質問者

お礼

大変参考になりました。 ありがとうございました。

vBvCBug
質問者

補足

仰るとおりdouble型にしただけではイニシャライズでエラーになり 簡単にはできそうにありませんでした。 あきらめてとりあえずMFC AppWizard(dll)で作成することにしました。 教えていただいたとおりに組んだのですが どうしても _clsRatePtr serv; のところでエラーになってしまいます。 この宣言はどういった意味があるのでしょうか?

すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

#Importディレクティブを使って ActiveXDLLを組み込めば使えると思いますよ VB側で Public Function myRate(nper As Double, pmt As Double, _   pv As Double, Optional fv As Variant = 0, _   Optional due As Variant = 0, Optional guess As Variant = 0.1) As Double Dim apr As Double apr = Rate(nper, pmt, pv, fv, due, guess) myRate = apr End Function クラスモジュールに記述します クラス名を clsRateとして DLLを作成します VC側のAfxStd.hなど プロジェクトの共通ヘッダなどで #import "DLLのフルパス" no_namespace #include <atlBase.h> // CComVariant用 VCのイベントハンドラで   struct InitCOM {     InitCOM() { CoInitialize( NULL ); }     ~InitCOM() { CoUninitialize(); }   } g_Init;   _clsRatePtr serv;   HRESULT hr = serv.CreateInstance( __uuidof( clsRate ) );   if ( FAILED( hr ) ) {     AfxMessageBox( "FAILED" );     return;   }   double npr, pmt, pv, apr;   // 48回   npr = 48.;   // 月々 40000返済   pmt = -40000.;   // 元金 100万円   pv = 1000000.;   // 計算結果   apr = 0.0;   CComVariant fv, due, guess;   // 残価   fv = CComVariant( 0 );   // 期首:1/期末:0   due = CComVariant( 0 );   // 計算開始利率   guess = CComVariant( 0.12 );   serv->raw_myRate( &npr, &pmt, &pv, &fv, &due, &guess, &apr );   // 月レートに直して パーセントに換算   apr *= 12 * 100;   CString str;   str.Format( "%.2lf", apr );   AfxMessageBox( str ); と言った具合で使えますよ

vBvCBug
質問者

お礼

大変参考になりました。 ありがとうございました。

vBvCBug
質問者

補足

詳しい書き方をありがとうございます。 教えていただいたとおりにプログラムを書いたのですが C1189というエラーコードが出てしまいました。 どうやら原因はソースを*.cに書いていることのようなのですが 事情があり*.cppを使用することが出来ません。 やはり*.cでは無理なのでしょうか? それともいま作っているプログラムとは別に*.cppでDLL(DLL2とします)を作って DLL2をいま作っているプログラムで呼び出すようにすればいいのでしょうか?

すると、全ての回答が全文表示されます。
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

>RATE関数と同じ動きをするC++の関数も見当たらず困っています それは、自分で作らないと。。。 >どなたかVB6.0の関数をC++で使えるようにする方法 VBの関数をわざわざ呼び出さなくても、 投資期間を通じての利率を計算する関数を書いた方が早くないですか。。? http://support.microsoft.com/kb/110854/ja

vBvCBug
質問者

お礼

大変参考になりました。 ありがとうございました。

vBvCBug
質問者

補足

回答ありがとうございます。 そのページは自分でも見つけたのですが、 そこに乗っている計算式は月々の支払額が 不明な場合の計算式だったので使いませんでした。

すると、全ての回答が全文表示されます。

関連するQ&A