No.5ベストアンサー
- 回答日時:
_clsRatePtr serv;
これは COMサーバーへのポインタ宣言だと思います
VB6側で作成した COMクラスのことです
_は Cの場合よく付加される修飾ですよね
#import ディレクティブの宣言が上手くいっていないのかも …
この回答への補足
申し訳ありません。
原因は、VBでのDLL作成でのミスでした。
それを修正したことでC++での呼び出しは行うことができました。
本当にありがとうございました。
No.4
- 回答日時:
>支払額が不明な場合の計算式
なるほど。。。
>それともいま作っているプログラムとは別に*.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を呼び出す。
以上のような流れのイメージで合っていますでしょうか?
No.3
- 回答日時:
Cでとなると クラスが使えないのでつらいでしょうね
VBとのインターフェースにC++で作ったDLLをかませてってことになると思いますよ
AtlBase.hはCComVariantを使うためなので
バリアント型の引数をやめてしまって全部doubleにしちゃうとか
WINAPI側の VARIANT構造体で書き直すとかかなぁ
でも COM関連のイニシャライズとかが問題になるかも
外部に公開する関数は Cリンケージ(extern "C"で修飾)にしておいてやれば良いように思います
この回答への補足
仰るとおりdouble型にしただけではイニシャライズでエラーになり
簡単にはできそうにありませんでした。
あきらめてとりあえずMFC AppWizard(dll)で作成することにしました。
教えていただいたとおりに組んだのですが
どうしても _clsRatePtr serv; のところでエラーになってしまいます。
この宣言はどういった意味があるのでしょうか?
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 );
と言った具合で使えますよ
この回答への補足
詳しい書き方をありがとうございます。
教えていただいたとおりにプログラムを書いたのですが
C1189というエラーコードが出てしまいました。
どうやら原因はソースを*.cに書いていることのようなのですが
事情があり*.cppを使用することが出来ません。
やはり*.cでは無理なのでしょうか?
それともいま作っているプログラムとは別に*.cppでDLL(DLL2とします)を作って
DLL2をいま作っているプログラムで呼び出すようにすればいいのでしょうか?
No.1
- 回答日時:
>RATE関数と同じ動きをするC++の関数も見当たらず困っています
それは、自分で作らないと。。。
>どなたかVB6.0の関数をC++で使えるようにする方法
VBの関数をわざわざ呼び出さなくても、
投資期間を通じての利率を計算する関数を書いた方が早くないですか。。?
http://support.microsoft.com/kb/110854/ja
この回答への補足
回答ありがとうございます。
そのページは自分でも見つけたのですが、
そこに乗っている計算式は月々の支払額が
不明な場合の計算式だったので使いませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセル if関数 4 2023/04/27 11:35
- Excel(エクセル) ユーザー関数の自動計算(excel2003) 1 2023/02/06 06:46
- 経済学 「政府支出乗算」の求め方を教えてください。 2 2022/11/20 19:52
- C言語・C++・C# プログラム内から、MIDIファイルの一部分だけを再生する方法 1 2023/02/15 11:08
- Excel(エクセル) Excel関数の質問です。 5 2022/04/23 12:53
- Excel(エクセル) エクセルの関数について 5 2023/01/26 15:26
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- Excel(エクセル) スプレッドシートの関数 2 2022/11/16 17:36
- Excel(エクセル) 関数式を教えてください。 AとBのセルがあり、Aのセルに値がある場合はCのセルへ1と表示。 AとBの 5 2022/03/23 14:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CMainFrameクラスの使い方
-
このコンパイルエラーの意味に...
-
FriendとPublicの違い。。。
-
ダイアログクラスのコントロー...
-
ダイアログ表示時にチェックボ...
-
【C++】vectorについて
-
既定のコンストラクタがない?
-
(UWSC) 「#32770」の意味わかり...
-
VC++ リストボックスにデータを...
-
VB.NETでのEnumの使用について
-
DLLからEXEのクラスを呼び出す...
-
privateなメンバ関数をテストす...
-
VC++ Express m_hWnd
-
C#で、動的にサブクラスを取得...
-
Visual C++ 6.0 でクラス表示が...
-
MFCのドラッグ&ドロップについて
-
不要になった、普通の構造体の処理
-
MFCアプリのコマンドラインでパ...
-
クラスのアドレスを引数として...
-
ウィンドウの背景に画像を配置する
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
イベントにAddHandlerされてい...
-
クラスのアドレスを引数として...
-
ダイアログ表示時にチェックボ...
-
(UWSC) 「#32770」の意味わかり...
-
エディットコントロールのイベ...
-
エディットコントロールでEnter...
-
WindowsAPIのリストビューの...
-
CMainFrameクラスの使い方
-
DebugクラスとTraceクラスの違い
-
MessageBoxを継承したい
-
C++ protectedにアクセス不可
-
MFCアプリのコマンドラインでパ...
-
このコンパイルエラーの意味に...
-
MFCのドラッグ&ドロップについて
-
【ASP.NET】 独自で作成したク...
-
派生クラスから基本クラスprote...
-
ダイアログクラスのコントロー...
-
C#で通常のbuttonコントロール...
おすすめ情報