CのDLLファイルをVBで

解決


紅葉くん  2003-10-29 14:26:03  No: 109482

今C++とVBを勉強したいと思って初めているのですが
Cで
#include <stdio.h>
main()
{
 printf("1+1は%dです\n",1+1);
}
例えばこのように作り
これのDLLファイルというのを作り?
VBの方で使用したいという場合は
VBの方ではまずどのようにアイコン等を用意すればいいのでしょうか?
あとC++でDLLファイルはどのように作るのでしょうか?
またそのDLLファイルをVBで必要な時に読み込むというのでしょうか。。
そのDLLをVBでも使用できれば、Cで書いたやつをVBで使用していけると思います。

日本語の表現が多々間違っているかもしれませんが
わかりにくかったらどんどん聞いてください。
かなりの初心者なのであまり難しい用語を使わずに
説明していただけると助かります。
宜しくお願いいたします。


紅葉くん  2003-10-29 14:46:02  No: 109483

えと
色々教えていただけるように
言葉の表現を考えたのですが
例えばcの方でテキストボックスを3つ作り
()+()=()
で上のかっこはボックスだとして
数字を入れて
OKボタンを押したら足し算が
できるというプログラムを作るとします
その時に足し算のプログラムをCで作っている事になりますが
VBは画面だけに使って計算部分だけををCでDLLにしてそれをVBで使用できますでしょうか?またその時にCの計算部分のDLLはどうやって作ればよろしいのでしょうか?

上とあわせて読んで頂ければ少しは
質問の内容がわかりやすくなったかもしれません。
表現力と知識がなくても申し訳ございませんが宜しくお願いいたします。


魔界の仮面弁士  2003-10-29 16:52:59  No: 109484

> VBの方ではまずどのようにアイコン等を用意すればいいのでしょうか?
アイコンは単なる画像なので、この場合は関係ないかと。

> あとC++でDLLファイルはどのように作るのでしょうか?
それは、VB系の掲示板で質問する事ではないような。

> またそのDLLファイルをVBで必要な時に読み込むというのでしょうか。。
defファイルを作って関数を公開したDLLなら、VBのDeclareステートメント、
ActiveX DLLの場合は、VBから参照設定して使います。
C++.NET製のDLLの場合は、COM InteropでActiveX化して、RegAsm.exeを使いましょう。

> VBは画面だけに使って計算部分だけををCでDLLにしてそれをVBで使用できますでしょうか?
可能です。

> またその時にCの計算部分のDLLはどうやって作ればよろしいのでしょうか?
下記を参照してみてください。
http://www.microsoft.com/japan/msdn/vs_previous/vbasic/docs/dll/


ねろ  2003-10-29 17:09:38  No: 109485

http://www.angel.ne.jp/~mike/vb_dll/index.html
この辺に同じようなサンプルがあるので
これを読んで理解できない所を質問されたらと。

http://support.microsoft.com/default.aspx?scid=http://www.microsoft.com/japan/support/kb/articles/410/8/37.asp?
の「基本的な呼び出しの サンプル」も読んでね。


紅葉くん  2003-10-30 19:39:03  No: 109486

さっそくのお返事ありがとうございました。
教えていただいた所を読み勉強してみます。
それでもわからなかったらまた質問するかもしれないですが
その時は宜しくお願い致します


紅葉くん  2003-11-05 06:50:07  No: 109487

回答ありがとうございました。
紹介されたところを見たところ、dllが作れるのはわかったのですが
またわからない所があります。
私がやろうとしている事はすでにできている計算プログラムをVBで使用したいのです。
例えば
#include    "test.h"
main()
{
int    i;
data();    // 計算データの読み込み
band();    // 幅の決定
clear();  // 初期化
dmat();    // 計算
{
area();    // 各要素の面積の計算
bmat();    // 計算
emat();    // 要素の計算
merge();  // 全体への埋め込み
}
bound();  // 条件の処理
gauss();  // 連立方程式を解く
strain();  // 各要素1の計算
stress();  // 各要素2の計算
output();  // 計算結果の出力
}
のようなc++のmainプログラムがありとします。
他にboundとか作りそこで個別に計算を行いうえのmainで読み込むという感じです。このような場合どうやってdllを作ればよろしいのでしょうか?
ねろさんに説明してもらったのは、dllを作りそれをいじりdllを完成させて
vbで読み込むという感じかなと理解しました。
私のは上にあるようにmainがあり、それにdataがあり読み込んでやるという長いプログラムなのですが、このような場合はmainはmainでdllを作り、他のdataも個別にdllを作っていけばよいのでしょうか?また、その場合のdllはどうやってつくればよいのでしょうか?  長くて意味不明なところもあるかもしれませんが、できる限りで教えて下さい。宜しくお願いいたします。


よん  2003-11-05 10:37:19  No: 109488

そんなものはCOMで作りなさい


ねろ  2003-11-05 20:02:58  No: 109489

通常はmainをVBで作ります。
mainから各関数を呼び出す感じになります。
従って最初に各関数が、どんなパラメーターを必要とし、
何を処理の結果として返すのか決めます。

単なる足し算なら
VB側では
Call Kansu1(a,b,c)

C側では
Void  Kansu1(int a,int b,int c){
  c = a + b;
}
こんな感じで。


いちゆ  2003-11-05 20:45:12  No: 109490

…int* c?


紅葉くん  2003-11-07 06:42:05  No: 109491

助言ありがとうございます。
ねろさんの例題で少しはわかったような気がしてきました。
dllはいまいち難しいかも。。。VBに書き直してみようかなと思います。
前に紹介してくれたHPとあわせてもう少し自分で頑張って見ます。
今から頑張って取り組んでみます!また何かありましたら
宜しくお願いいたします。


ねろ  2003-11-07 07:33:49  No: 109492

始め全てVBで作っておいて、スピードが
必要な所をCでDLLを作る方法がいいでしょう。


紅葉くん  2003-11-13 07:24:23  No: 109493

ねろさんが紹介してくれた
http://www.angel.ne.jp/~mike/vb_dll/index.html
↑のHPでDLLファイルの作り方を参考にまったく同じものを作ってみたのですがDLLファイルが見つかりませんとエラーがでてしまいます。

ソフトはVB6.0とVC++6.0を使っています。
HPと同じものを作ればキチンとできるのでしょうか?
エラーの感じからしてうち間違いとかはないと思うのですが。。。 

このHPの内容が間違っているのでしょうか?
間違っていたらどこを直したらいいか
またはこのように例が載っているほかのHPを教えて頂けないでしょうか?


Say  2003-11-13 08:07:03  No: 109494

DEFファイルの認識させそこないでは?


助言  2003-11-13 17:01:26  No: 109495

卒論は自分でやりましょう。


ねろ  2003-11-13 19:50:47  No: 109496

作成したDLLをWindowsのSystemか又は
VBの実行ファイルのあるフォルダーに
コピーしましたか?
もしコピーしてあるなら  Sayさんの
言うDEFファイルの設定ミスかと。


紅葉くん  2003-11-18 07:37:09  No: 109497

返事遅くてすいません。DEFの設定ミスですか。。
う〜ん、その辺のところをもう少しやってみますね。
ありがとうございました。


紅葉くん  2003-11-20 10:59:02  No: 109498

DEFやコピーの仕方を変えてみたらできるようになりました。
他にdllだけでなく中間アプリケーションなど全てフォルダを
統一してコピーしたらできるようになりました。
これを改良したいのですが、ねろさんに教えてもらった所では
1つのDLLに1つの関数のやり方なのですが1つのDLLに複数の関数を
入れるためにはどうしたらよいのでしょうか?
また参考になるページがあったら教えてください。
宜しくお願いいたします。


ねろ  2003-11-20 17:45:26  No: 109499

どんどん並べて書いていけばいいだけですよ。
EXPORTSの所も並べて。
EXPORTS
    aaaa
    bbbb
といった具合に


紅葉くん  2003-11-21 08:02:46  No: 109500

そうだったのですか。
自分でも工夫したけど混ぜていったらエラーがでたので
いきずまってしまいました。
並べていけばいいのですね。本当に毎回すいません。
まだプログラム頑張っていけそうな気がします。
いまから早速試してみます。
有難うございました。


紅葉くん  2003-11-21 11:51:15  No: 109501

あれから何回も並べて書いてみたのですが
どう並べ変えてもエラーがでます。
これが最終的には自分的にエラーが2つなり
一番少なかったのでこれを見ていただけないでしょうか?

//VC++  dll.cpp
    TEST_API int __stdcall fncSub(int a, int b )
{
    TEST_API void __stdcall fncSub(double * c, double * d, double* e)
{
    return  *c = a + b + *d + *e;    
}
}

エラー箇所2つ
1つ目  error C2491: 'fncSub' : dllimport 関数 の定義は許されません。
2つ目  dll.cpp(31) : error C2601:'fncSub' : ローカル関数の定義が正しくありません。

これ↑です。書き方が根本的に違うのでしょうか?
間違っているところを教えて頂けないでしょうか。
宜しくお願いいたします。


紅葉くん  2003-11-21 18:33:56  No: 109502

少し、聞きたい言葉が足りなかったので
補足させてください。
上のようにdouble型とint型とか複数の関数をまとめて使いたいです。
もし上の感じでできない場合、ほかに関数をまとめて使う書く方法が
あれば教えてください。宜しくお願い致します。


SKY  2003-11-21 19:17:38  No: 109503

まだまだ初心者なのであってないかもしれないけどRESします。
一応こんな方法はどうでしょうか?
Private Sub Command1_Click()
Dim L As Integer
Dim C As Double
Dim S As Integer
Dim W As Double
Dim D As Integer
Dim A As Double

L = 4
C = 3.4
S = 4
W = 2.3
A = Val(L + C)
Text1.Text = A
D = A
Text2.Text = D
End Sub

簡単な算数の計算ですが回答はtext1はDouble型、text2はinteger型で出すようなプログラム(になっているはず^^;
一つ一つ定義して書いてやってますがこの方法ではだめでしょうか?


SKY  2003-11-21 19:20:04  No: 109504

↑のS、Wは定義してるけど使用してないの気にしないでください^^;
確認ミスです><


紅葉くん  2003-11-21 22:30:14  No: 109505

せっかく答えてもらったんですが、それはVBで私がやりたいのは
VBのテキストボックスで入力してc++のdllに渡して
答えをVBにもってくる方法です。で今わからないところは
C++のDLLの部分です。わかるようでしたら、またお願いします。


ねろ  2003-11-22 06:13:34  No: 109506

う!    (^_^;
>TEST_API int __stdcall fncSub(int a, int b )
まず;が無い
TEST_API int __stdcall fncSub(int a, int b );

"}"がおかしい
>TEST_API void __stdcall fncSub(double * c, double * d, double* e)
voidでは無い、引数の数がおかしい

>return    *c = a + b + *d + *e;     
これもおかしい。

a + b + cを返したかったら

TEST_API int __stdcall fncSub(int a, int b, int c);  //宣言
TEST_API int __stdcall fncSub(int a, int b , int c)
{
    return a + b + c ;
}
こうですよ

VBの方は
Declare Function fncSub Lib "TEST.dll" (ByVal a As Long, _
  b As Long, ByVal c As Long) As Long

Private Sub Form_Load()
    MsgBox fncSub(25678, 345678, 445678)
End Sub
こんなんですよ。


ぽっぽー!  2003-11-22 06:32:06  No: 109507

ローカル関数のexpoertは出来ないのでは?
あと、exportする関数にオーバーロードもできたかな?
という感じですが、もし出来たらごめんなさい。


ぽっぽー!  2003-11-22 06:33:12  No: 109508

VCの板で聞いた方がいいと思いますが。


ねろ  2003-11-22 08:11:00  No: 109509

>ローカル関数のexpoertは出来ないのでは?
>あと、exportする関数にオーバーロードもできたかな?
#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif
と宣言したあればOKでは。
一様上のコードは確認済みです。(^^
質問者のコードは
http://www.angel.ne.jp/~mike/vb_dll/index.html
のコードの一部変更なのです。ここと合わせて読まれると
判ると思います。
>VCの板で聞いた方がいいと思いますが。
私もそう思いますがCの方に行けばVBの方に行けといわれそうです。(^^;


しっぽ  2003-11-22 08:12:11  No: 109510

TEST_API のマクロはどう記述なされていますか。
( __declspec( dllimport ) など )


紅葉くん  2003-11-24 07:14:25  No: 109511

さっそくのお返事ありがとうございます。
本屋もまわって探してきたのですが、これといった決めての
本がなかったです。。

>VCの板で聞いた方がいいと思いますが。
>私もそう思いますがCの方に行けばVBの方に行けといわれそうです。(^^;

う〜ん、VCとVBの両方の知識が必要な事なのでどっちにとも
言えないので、困ってます。。

いわれたとおりの方法を早速ためしてみますね。
色々と申し訳ありません。


紅葉くん  2003-11-24 07:38:04  No: 109512

え〜と、しっぽさんのマクロって
#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif 

↑の部分の事でしょうか?
この部分の事でしたらこのようにしています。
なにぶん今必死に勉強中なのでしっぽさんの質問にちゃんと
答えてなかったごめんなさい。

あとねろさんに書いて頂いた
>TEST_API int __stdcall fncSub(int a, int b, int c);  //宣言
>TEST_API int __stdcall fncSub(int a, int b , int c)
>{
>    return a + b + c ;
>}

の部分ですが、これは分かってこういうのは↑ねろさんや皆様のおかげでできるようになっています。ありがとうございました^^

他になんですが
↑のこれはint型(整数)しか使っていないですよね?
これにvoid型(データが何もない型)とかdouble型(少数)とか
整数以外にも少数とか混ぜる事はできないのでしょうか?
う〜ん、うまく言葉になってませんね。。

例えばVCのヘッダーの方で

#include <stdio,h>
//関数定義
void  data();
//DATA関数で用いるグローバル関数
double  AAA;

とかがあり

#include
main()
{   int   i;
    data();

printf("入力データの出力確認")
}

とかこんな感じの場合の物があったとしたら
DLLをつくるさいにint型だけでなく
double型もまぜたDLLにしなくてはいけないです。

double型とかを混ぜたりするのは不可能なのでしょうか?
それともintはintでdoubleはdoubleで別々にdllを作っていかなければ
ならないのでしょうか?

言葉がへんで申し訳ないです。質問ないようがいまいちわからなかったら
言ってください。頑張って伝えれるようにします。
宜しくお願いいたします。


しっぽ  2003-11-24 08:01:52  No: 109513

> え〜と、しっぽさんのマクロって
ハイ、その個所です。

その後の文面からして
もう error C2491 は解決なさったと理解してよろしいですか?


特攻隊長まるるう  2003-11-24 11:55:49  No: 109514

オーバーロード(多重定義)したいの?
演算するなら型の違いをどこかで埋めないといけない
気がするけど、型変換(キャスト)についてはどう考えてるの?
型の違いで同じビット列でも違う数字を表しますよね?
型は厳密に定義しておいた方がいいですよ?
>//VC++  dll.cpp
>    TEST_API int __stdcall fncSub(int a, int b )
>{
>    TEST_API void __stdcall fncSub(double * c, double * d, double* e)
>{
>    return    *c = a + b + *d + *e;        
>}
>}
…はハッキリ言ってめちゃくちゃだけど(^^;)、こんな事がしたいのかなぁ?
TEST_API int __stdcall fncSub(int a, int b, int c);  //宣言
TEST_API int __stdcall fncSub(double a, double b, double c);  //宣言

TEST_API int __stdcall fncSub(int a, int b , int c)
{
    return fncSub((double)a, (double)b, (double)c) ;
}
TEST_API int __stdcall fncSub(double a, double b , double c)
{
    return a + b + c ;
}
Cは開発環境で実験しながらでないと書けないので上のコードが通る
ものなのかどうかの保障はしません。考え方だけ汲んでね(^^;)


特攻隊長まるるう  2003-11-24 12:19:31  No: 109515

ああ…戻り値も考えた方がいいのかな…。
それと引数の中で整数と小数をまぜる考え方なら更に有効桁も
意識しておかないと誤差の範囲にデータが埋もれて丸められて
で使えないものになるんじゃないかな?。


特攻隊長まるるう  2003-11-24 13:07:41  No: 109516

あ、ちょっと分かった。
TEST_API int __stdcall fncSub(int a, int b);  //宣言
TEST_API int __stdcall fncSub(double a, double b, double c);  //宣言

TEST_API int __stdcall fncSub(int a, int b )
{
    return a + b ;
}
TEST_API void __stdcall fncSub(double a, double b , double c)
{
    a = b + c ;
}
こうかな??数値の演算だったらポインタいらないよね?
Cの値渡しと参照渡しってどうだったっけ?


特攻隊長まるるう  2003-11-24 13:11:59  No: 109517

あああっ…宣言の方の戻り値 int 型を直してないし…この書き方だったら
関数本体だけでもよかったよね?。宣言の2行消してください。

…あと連続カキコごめんなさい。この時間…頭まわってないなぁ。うん。


ねろ  2003-11-25 00:20:32  No: 109518

紅葉くんさん  ん! "くん"がついている場合は"さん"は不要かな..
”孟嘗君”この場合は"さん"がいるのか。(^^;
まずどのような計算がしたいか最初に決めましょう。
たとえば
a=19.5 ; b=32.6 ; c=54.3 これらを足してdに入れて返す
プログラム。
と言った具合に、これによってVBでどのようなコードが
必要で、Dllでは何が必要か決まります。

それとVBとVCの"データー型"について確認しておきましょう
呼び出す側と呼び出される側では基本的にデーター型
は同じ必要があります。

ぽっぽー!さん
しっぽさん
DLLの部分はC++のウイザードが吐き出すコードのサンプルの
部分を少し変えているだけです。よほど難しいことをしなければ
DLL作成はそれでOKかなと。


紅葉くん  2003-11-25 19:44:16  No: 109519

みなさん、本当にお世話になってます。
返事が遅くてごめんなさい。
はじめにしっぽさん。
そのエラーは解決できたと思います。
ありがとうございました。

特攻隊長まるるうさん、ねろさん
とても長く真剣にお返事助かります。

今日の夜に早速助言していただいたとおりに
プログラムを試してみたいと思います。

また、今日の夜にでも試した結果についてレスできるよう
頑張りたいと思います。
いつも長い文読んで頂いて本当にありがとうございます。


紅葉くん  2003-11-25 19:49:23  No: 109520

あ、ねろさん。
紅葉くんなので”さん”は不要でもいいですよ〜。
どっちでもいいです^^


紅葉くん  2003-11-26 03:28:31  No: 109521

ねろさんなど皆さんの助言を参考に早速作りたいプログラムを
作ったのですがエラーが2つでてしまいました。VCの方のDLLです。

内容は

// TEST.cpp : DLL アプリケーション用のエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "TEST.h"

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
                    )
{
switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
}
    return TRUE;

TEST_API  void __stdcall  fncSub(double aa, double bb, 
double c[2],double ee, double dd )

{
    double  sum=0;
{  
  
  int i;

    for(i=0; i<3, i++)
{
  sum = sum + c [i];
}
    dd = aa * sum;
    ee = dd * sum;

  return;
}

}

というcppでは
エラー文は

1.\VC\TEST\TEST.cpp(7) : error C2146: 構文エラー : ';' が、識別子 'BOOL' の前に必要です。

2.\VC\TEST\TEST.cpp(7) : fatal error C1004: 予期せぬ EOF が検出されました。

このエラーはどうしたらよいのでしょうか?
この辺については教えて頂いたHPや本にもなかなか書いてないのでよく
わかりませんでした。
またエラー以外にも計算や記述で変な所がありましたら
教えて頂けませんでしょうか?
他にもhの方のファイルとかが必要でしたら言って下さい。
すぐ添付しますので。

このプログラムを言葉で説明すると
VBの方では5つの数字を入れてモジュールを通してVCのDLLに渡すのですが
そのときにVBから渡すときは箱で渡すようにしたいです。値渡しではなく参照
渡しという事です。

で上のDLL部分で配列を使い計算し
答えdd eeをVBのモジュールに渡してVBのほうに
答えを2つ出力させるという感じにしたいと思っています。

また、変な長文で申し訳ございません。
情報、アドバイス等の方宜しく御願い致します。


しっぽ  2003-11-26 05:00:51  No: 109522

エラー C2146
ヘッダーファイル(TEST.h)で「;」が欠落しているところが
あるのかもしれません。


ねろ  2003-11-26 07:41:44  No: 109523

ん〜!
まず構文の間違いは
for(i=0; i<3, i++) -> for(i=0; i<3; i++)
ここだけかな。
デバッグウインドウでエラーが示された行をクリックすると
エラーの行に飛びますよ。
ただこれだと引数が色々でVBの方からの呼び出しが難しい。
こういう場合はC側はポインターでVB側は配列で受け渡します。
#C側
TEST_API  void __stdcall fncSub(double *c);
TEST_API  void __stdcall fncSub(double *c)
{
    double  sum = 0;
    int i;
    for(i=0; i<3; i++){
        sum += *(c + i);      //p(0)〜P(2)までの足しこみ
    }
    *(c + 5) = *(c + 3) * sum; //*(c + 5) = p(5)
    *(c + 6) = *(c + 4) * sum; //*(c + 6) = p(6)
}

#VB側
Private Declare Sub fncSub Lib "TEST.dll" (p As Double)
Private Sub Command1_Click()
    Dim p(0 To 6) As Double
    p(0) = 10.3: p(1) = 20.5: p(2) = 30.6: p(3) = 40.2: p(4) = 50.1
    fncSub p(0)       'DLLの呼び出し
    Text1.Text = p(5) '結果の表示
    Text2.Text = p(6) '結果の表示
End Sub
こんなかんじになります。
*(c + i)なんかが判りにくいのですがほぼ配列と同じと思ってください。


紅葉くん  2003-11-26 11:37:19  No: 109524

しっぽさん、そのとおりでした。
;をつけて解決できました。
本当にありがとうございます。

ねろさんのいうとおり、c[2]といった配列を使うと
VBの方で標準モジュールの宣言の時にどうしたらいいかわからなくなって
しまいました。

上に書いたVCの方はちゃんとリビルドまで完成したのですが。

ねろさんの教えて頂いた通りポインタ変数でやろうとしたのですが
ねろさんに書いて頂いたプログラムが
エラーがどうしてもエラーが出てしまいます。
ヘルプで見てもヘッダーファイルが壊れている可能性とか
たぶん違う事しか出てきません。

内容はこんな感じです。

TEST_API  void __stdcall fncSub(double *c)
{
    double  sum = 0;
{
    int i;
    for(i=0; i<3; i++)
{
        sum += *(c + i);      //p(0)〜P(2)までの足しこみ
}
    *(c + 5) = *(c + 3) * sum; //*(c + 5) = p(5)
    *(c + 6) = *(c + 4) * sum; //*(c + 6) = p(6)
  return;
}
}

エラー文は
28個で主に
1つ目が\TEST.cpp(34) : error C2018: 文字 '0x40' は認識できません。

2つ目はTEST.cpp(34) : error C2018: 文字 '0x81' は認識できません。

といった感じが28個くらいです。

これはどうしたらよいのでしょうか?
ヘルプ見ると正しい文字ではないです。
とか私には少し理解できないエラーでした。


ねろ  2003-11-26 16:57:36  No: 109525

コードをコピペした時に不要な目に見えない文字が
行の先頭についてしまいました。
一行ずつ行の前の空白をBackSpaceで消して
代わりにスペースを挿入するとエラーは消えます。
それとreturn;はいりません。


紅葉くん  2003-11-27 00:34:05  No: 109526

そんな基本的な事まで
指摘してもらってごめんなさい。
早速試して見ます^^


紅葉くん  2003-11-27 11:04:38  No: 109527

う〜ん。。
ねろさんに書いて頂いたプログラムを走らせてみたのですが
Sub又はFunctionは定義されてませんと
VBの実行時点でエラーがでてしまいます。

それで少し自分なりに考えて以下のものにしてみたのですが
今度は走るのですが、結果が絶対0になってしまい
おかしいと思い、Cの値を消したりして
モジュールに渡さないで実行してみたら
ボタンを押すと絶対0がでてしまいます。

もしやと思い答えのところに適当な数字を入れて
その数字がでるようにしたら、ボタンを押すと
そのプログラムでいれた数字がそのまま出てしまいました。

どうしたらよいでしょうか?
またせっかく教えて頂いたのにつまらないミス
のせいでちゃんとできてないのでしょうか?

あとねろさんの方のやつはモジュールの所をパブリックでやると
走ったのですが、それだとやっぱり答えが0にしかなりません。
値を入れても0になってしまうのでCで計算されてないのかなと思いました。

一応、私が自分なりに改良したプログラムも
レスしてみます。(0になってしまうプログラムです)
こちらの方も教えていただけたら
幸いです。

VB
標準モジュール
Public Declare Sub fncSub Lib "TEST.dll" (p As Double)
ボタンプログラム

Private Sub Command1_Click()

    Dim p(0 To 6) As Double
    
    p(0) = Val(Text1.Text)
    p(1) = Val(Text2.Text)
    p(2) = Val(Text3.Text)
    p(3) = Val(Text4.Text)
    p(4) = Val(Text5.Text)
    
    fncSub p(0)       'DLLの呼び出し
    
    Label11.Caption = p(5)  '結果の表示
    Label12.Caption = p(6)  '結果の表示

End Sub

VCのTEST.cpp
TEST_API  void __stdcall fncSub(double *c)
{
double  sum = 0;
{
int i;
for(i=0; i<3; i++)
{
sum  = *(c + i) + sum;      //p(0)〜P(2)までの足しこみ
}
*(c + 5) = *(c + 3) * sum; //*(c + 5) = p(5)
*(c + 6) = *(c + 4) * sum; //*(c + 6) = p(6)
}
}

TEST.h
TEST_API  void __stdcall fncSub(double *c)

TEST.def
LIBRARY TEST.DLL

EXPORTS
  fncSub

上のような感じです。
宜しくお願い致します。


紅葉くん  2003-11-27 11:12:43  No: 109528

あ、あと上のプログラムで
TEXTを5つも使ったのは
最終的には自分で5つの値を入力したいからです。


ねろ  2003-11-27 17:24:28  No: 109529

お!今回は変な間違いはありませんね。
まず
>Sub又はFunctionは定義されてませんと
宣言をModuleに置く場合は  Public
Formに置く場合は          Private
となります。

書かれたコードですが
TEST.h
TEST_API  void __stdcall fncSub(double *c)

TEST.h
TEST_API  void __stdcall fncSub(double *c);
でセミコロンが抜けていますが多分コピーした時に抜けたのでしょう
このままではコンパイルが通りませんから。
ということはコードは全てOKです。一応念の為確認してみました。
ではなぜ答えが出ないのか、前に作った古いDLLを参照しているのかも
知れません。
エクスプローラーのファイル検索で"TEST.DLL"を検索して
見つかった"TEST.DLL"を全て消し、再度"TEST.DLL"をコンパイルして
出来たDLLをVBのファイルがあるフォルダーにコピーします。
そしてVBのPrivate Sub Command1_Click()の先頭に
    ChDrive "C:"  'VBのあるドライブ DならD:
    ChDir App.Path
を入れてみてください。これでVBのコードのあるフォルダーの
TEST.DLLが参照されるはずです。


紅葉くん  2003-11-27 19:30:59  No: 109530

おはようございます。
またさっそくのレス嬉しいです^^
あとからさっそく試してみますね。
上手くできますように!!


紅葉くん  2003-11-28 03:18:45  No: 109531

こんばんわ。
早速プログラムを試してみました。
ねろさんの言うとおりちゃんと動きました。
本当にありがとうございました。
ねろさんやしっぽさんや特攻隊長まるるうさんやその他多くのみなさんの
おかげです。ありがとうございました。
とりあえずこの問題は解決しました。
とくにいつも多く細かくレスしてくれたねろさんにはとても感謝しています。
まだ色々プログラムやってみる気なので
またすぐに質問する事もあるかもしれませんが
この質問は解決という形になりました。
ありがとうございました。
またこれからも宜しくお願い致します。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加