プロが教えるわが家の防犯対策術!

いまVB6.0のRATE関数をC++で使いたいと考えています。
自分なりに調べてVB6.0でActiveX DLLを作ってみたりしたのですができませんでした。
また、RATE関数と同じ動きをするC++の関数も見当たらず困っています。

どなたかVB6.0の関数をC++で使えるようにする方法か、
RATE関数と同じ動きをするC++の関数をご存知のかたがいましたら教えてください。
宜しくお願いします。

A 回答 (5件)

_clsRatePtr serv;


これは COMサーバーへのポインタ宣言だと思います
VB6側で作成した COMクラスのことです
_は Cの場合よく付加される修飾ですよね

#import ディレクティブの宣言が上手くいっていないのかも …

この回答への補足

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

補足日時:2007/11/07 18:39
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/07 18:42

>支払額が不明な場合の計算式


なるほど。。。

>それともいま作っているプログラムとは別に*.cppで
>DLL(DLL2とします)を作ってDLL2をいま作っているプログラムで
>呼び出すようにすればいいのでしょうか?
Cだとこれがいいでしょう。

No3さんも指摘していますが、CoInitializeは
スレッド毎に呼び出す必要がありますので、スレッドの
アパートメントを考えれば、CoInitializeはDLLの呼び出し側で
DLLの関数を使用する前にコールするのが良いと思います。
DLL側からではスレッド毎にCoInitializeとCoUninitializeを
制御する方法が無いためです。
基本的にはプロセスの開始と終わりでそれぞれコールすれば良いかと。
#COMを使用する関数内に閉じれば出来ない事はありませんが、
#呼び出しすぎるとCoInitializeがエラーを返したりするうえ、
#DLLエントリからの呼び出しはMSが禁止していた気がします。

この回答への補足

CoInitializeとCoUninitializeを*.Cで作っているほうに書くということでしょうか?

*.CでCoInitializeとCoUninitializeを行い、*.CPPで作成したDLLを呼び出す。
*.CPPで作成したDLLからVBで作成したDLLを呼び出す。

以上のような流れのイメージで合っていますでしょうか?

補足日時:2007/11/07 10:54
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/07 18:42

Cでとなると クラスが使えないのでつらいでしょうね


VBとのインターフェースにC++で作ったDLLをかませてってことになると思いますよ
AtlBase.hはCComVariantを使うためなので
バリアント型の引数をやめてしまって全部doubleにしちゃうとか
WINAPI側の VARIANT構造体で書き直すとかかなぁ
でも COM関連のイニシャライズとかが問題になるかも

外部に公開する関数は Cリンケージ(extern "C"で修飾)にしておいてやれば良いように思います

この回答への補足

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

補足日時:2007/11/07 10:53
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/07 18:42

#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 );

と言った具合で使えますよ

この回答への補足

詳しい書き方をありがとうございます。

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

補足日時:2007/11/06 21:04
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/07 18:41

>RATE関数と同じ動きをするC++の関数も見当たらず困っています


それは、自分で作らないと。。。

>どなたかVB6.0の関数をC++で使えるようにする方法
VBの関数をわざわざ呼び出さなくても、
投資期間を通じての利率を計算する関数を書いた方が早くないですか。。?

http://support.microsoft.com/kb/110854/ja

この回答への補足

回答ありがとうございます。

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

補足日時:2007/11/06 20:59
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/07 18:41

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