• ベストアンサー

関数の呼び出し

同じDLL内にある関数から関数を呼ぶにはどうしたら 良いのでしょうか?

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

  • ベストアンサー
  • nabezo-
  • ベストアンサー率50% (2/4)
回答No.3

例えば、FuncA という関数の中で FuncB という関数をコールするならば FuncA が書かれているより前に FuncB の型が宣言されてなければいけません。 今回修正したように順番を変えればエラーにはなりませんが、一般的には 関数の型宣言をします。 #いっぱい関数があって、いろいろな呼ばれ方して、関数を書く順番を #考えなきゃいけないなんて、めんどくさいですよね。 例えば int型の関数だとしたら、以下のように書けばいいのです。 int FuncA(); int FuncB(); int FuncA() {  intRet = FuncB(); } int FuncB() {  return(ret); } int FuncA(); int FuncB(); の2つの宣言はソースの上の方で記述したり、ヘッダに記述して インクルードすればOKです。 規模が小さかったり、ローカル関数であればソースに書いてもいいですが、 規模が大きかったり、グローバル関数の場合はヘッダで管理するのが 一般的です。 で、本題の問題ですが、「期待する値が取得できません」というのが この質問を読んでいる人には伝わらないと思います。 もう少し具体的に書くと、みんな回答しやすいと思います。 まあ今回の問題は、デバッグして、B()関数で return している値を 確認すれば原因はすぐに判明するでしょう。 がんばってください。

その他の回答 (2)

  • nabezo-
  • ベストアンサー率50% (2/4)
回答No.2

補足に書かれているのはコンパイル時のエラーですよね? 単に型宣言してないだけは??? 普通はサブルーチンコールと同じですから問題ないはずですが、 何か特殊なことをしていますか???

wan-chan
質問者

補足

cpp内に関数を書く順番を変えました。 AからBを呼ぶ場合は、 Aの下にBの関数を書かなければならないんですね。(--; ゴメンなさい。 呼び出すことはできました。 (コンパイルはとおりました) が、上手く処理できてないみたいです。 期待する値が取得できません。 VBからBの関数を呼び出した場合には、 期待する値が返ってくるんですが…。 うーん…。

  • nakashi
  • ベストアンサー率51% (21/41)
回答No.1

>同じDLL内にある関数(A)から >関数(B)を呼ぶにはどうしたら >良いのでしょうか? DLLでも特殊なことはないと思う 通常に呼べないの? AもBも同一DLL内にあるのですか

wan-chan
質問者

補足

はい、 AもBも同一DLL内にあります。 通常に呼べません。 例えば、AからBを呼ぶ場合 intRet = B() と記述すると、Bは定義されていない識別子というエラーになってしまいます。

関連するQ&A

  • DLL の中の関数呼び出し

     Windows NT workstation Ver4.0 の上で、ボーランドC++ Ver5 を使って、owl を使ったソフトを作っています。  メーラーを作ろうとして、blatj のソースコードを組み込んでいます。 その中で、gensock.dll を読み込んで、その中の関数を呼び出すところがあるのですが、関数のエイトりーポイントが NULL で返ってきます。  自作した他の DLL については、関数の呼び出しは、 順調なのですが、この gensock.dll については上手くゆかないのです。  そこで、 ボーランドのDLLと、マイクロソフトのDLLでは 呼び出し方にどのような違いがあるのでしょうか?  Win API を使ってみても  TModule を使ってみても 同じような現象が起きています。  解決方法は gensock.dll のソースコード を使ってボーランドのコンパイラでDLLを作り直す以外には無いのでしょうか?

  • 関数の呼び出し

    エクセルの2列5行のファイルがあるとします、 このファイルの各列の平均を求める関数をheikinとします。 エクセルの2列のデータの平均を関数heikin(プロトタイプ宣言)のみでの求め方が解かりません。 また、求めた値をmain関数に返した後、別の関数(プロトタイプ宣言)でのheikinの呼び出しかたが解かりません。 各列ごとにプロトタイプ宣言を行えば求まるのですが、 どうかよろしくお願いします。

  • 関数呼び出しについて

    VB6.0でSubとFunctionの使い分けに迷っています。 ・関数呼び出しの使い分けについて教えていただけますか? ・どちらもcallで呼び出せるのでしょうか? ・関数はcallを使わなければならないのでしょうか?

  • API関数とDLL関数

    API関数とDLL関数って同じものですか? ネットで調べると・・・ API関数=Win API→ひとつひとつの関数(単独で機能するプログラムコード の塊)。     API関数はdllファイルの中にある関数をさす。 とのようなことが書いてあります。つまり、DLL関数(私の認識であると、.dllファイルの中にある関数)であり、この関数はAPI関数と同定義と認識しています。 まだまだ初心者で、この認識があっているか確信がもてません。 どうか教えていただけないでしょうか?? お願いいたします。

  • VBAでDLL呼び出し

    VBAに関する使用方法をお教えください。 例えばsheet1のA1の数値をVBC++で作成したDLLファイル内にある関数に引数として渡したいのですが、どうすればよいでしょうか? (どう記述すればよいのでしょうか) 初心者につき、分かりやすく説明をして頂ければ幸いです。 VBC++で作成したDLLファイル名 testdll.dll testdll.dll内で定義してある関数名はtest_sendです 以上、宜しくお願い致します。

  • API関数(DLL)の呼び出しにおいて、DLLの格納場所は?

    お世話になります。 VB.NETでAPI関数を呼び出す場合にまず、API関数を格納しているDLLを宣言しなけれならないと下記URLにあります。 (http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html) (a)DllImport属性を利用する方法 <System.Runtime.InteropServices.DllImport("DLL名")> _ Function API関数名(仮引数) End Function (b)Declareステートメントを利用する方法 Declare Function API関数名 Lib "DLL名" (仮引数) そこで、質問なのですが、(a)、(b)どちらの方法で実現する場合においても、DLLの格納場所はC:\Windows\System32でないといけないのでしょうか?(実際にコーディングしてもSystem32フォルダにないとエラーになってしまいます。) 任意のフォルダにDLLを格納し、そこを参照できるようにできるのでしょうか? また、一般常識としてDLLはSystem32フォルダに格納しておかないといけないものなのでしょうか? 以上、よろしくお願いいたします。

  • 関数から関数を呼ぶ

    VC++でDLLを作成しています。 超初心者です。 関数から関数を呼ぼうとしたら、 >関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。 というエラーがでました。 どういうことでしょうか?

  • 関数からの関数の呼び出しは

    下記のようなIF文の中で「URL」がカラならsend_check()を実行させたいのですが、→のところにどのように記載したらよいか教えていただけないでしょうか。 また、関数から関数へいくらでも呼び出していけるものですか。質問の仕方もよくわからないのですが、よろしくお願いいたします。 function submitCheck(){ if (document.mail.url.value==""){ →→→→ return false;} else return true; }

  • VBAからDLL呼び出し

    vbaからC++で作成したDllファイル内関数を呼び出し、使用しているのですが、dllファイル内に記述してあるprintfが出力できません。 何か良い方法があるのでしょうか?

  • DLLの関数呼び出しで引数があるとフリーズしてしまう。

    はじめまして、C言語勉強中の初心者です。 現在、DLLに定義されている関数を呼び出すことを試していますが、うまくいかないので質問させて頂きました。 DLLには2つの関数が定義されています。  1.void Hello()  2.void HelloEx(char *pval); 1の関数を呼び出す場合は異常なく終了するのですが、2の関数を呼び出すと、フリーズしてしまいます。 フリーズする原因が分からないので、教えて頂ければと思います。 以下にソースを掲載します。 因みにコンパイラはBCC5.5.1を使用しています。 ***************************************************** DLL(Hello.c) [bcc32 -WD Hello.c] ***************************************************** #include <windows.h> #include <stdio.h> __declspec(dllexport) void CALLBACK Hello(void) { printf("Hello!\n"); } __declspec(dllexport) void CALLBACK HelloEx(char *pVal) { printf("Hello!%s\n", pVal); } ***************************************************** EXE(HelloTest.c)[bcc32 -L HelloTest.c] ***************************************************** #include <windows.h> #include <stdio.h> typedef void (*Hello)(void); typedef void (*HelloEx)(char*); int main(void) { HMODULE hMod; Hello func; HelloEx funcEx; hMod = LoadLibrary( "Hello.dll" ); if(!hMod) return FALSE; func = (Hello)GetProcAddress( hMod, "Hello"); if(!func) return FALSE; funcEx = (HelloEx)GetProcAddress( hMod, "HelloEx"); if(!funcEx) return FALSE; func(); funcEx("World"); FreeLibrary(hMod); return 0; } *********************************************** 以上

専門家に質問してみよう