dllの操作の練習をしております。以下のソースのどこがおかしいのでしょうか?
add.dllの内容は単にa+bの結果をメッセージボックスに表示させるだけの処理です。add.lib(インポートライブラリ)をリンクさせればうまく動きます。
しかし、GetProcAddress()を使って明示的にdllを呼び出そうとすると、コンパイルエラーで
ADD(hWnd,5,5);
の行に
「int (__stdcall *)(void)' : 実引数が多すぎます。」
となります。このメッセージの意味もわかりません。
以下のソースのどこがおかしいのでしょうか?コンパイラはVC++6.0でOSはWin2000です。
#include<windows.h>
void CALLBACK ADD(HWND hwnd,int a, int b);
//ウィンドウプロージャ(ここは別に普通)
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp)
{
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow) {
static FARPROC ADD; //あやしい
HWND hWnd;
MSG msg;
WNDCLASS winc;
//ウィンドウを作る処理
//~(省略)~
/****明示的にdllを呼び出す****/
ADD = GetProcAddress( LoadLibrary(TEXT("add.dll")) , TEXT("ADD"));
ADD(hWnd,5,5);
/****************************/
while (GetMessage(&msg , NULL , 0 , 0 )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
お願いします。
No.1ベストアンサー
- 回答日時:
FARPROC は恐らく int (__stdcall *)(void) と定義されていて引数を受け取らず int を戻り値として返す関数へのポインタを意味しているのでしょう。
関数 ADD のプロトタイプでは、
void CALLBACK ADD(HWND hwnd,int a, int b);
と宣言されていますから、この関数のポインタを受けとって使用するには関数のポインタを受け取る変数を FARPROC にするのではなく、
void ( *func )( HWND, int, int );
というふうに宣言して、
func = GetProcAddress( LoadLibrary( TEXT( "add.dll" ) ) , TEXT( "ADD" ) );
func( hWnd, 5, 5 );
と、使用してやれば上手くいくと思います。
また、引数に HWND と int と int を取り、戻り値を返さない関数へのポインタ変数の宣言は冗長になるので以下のように宣言することも出来ます。
typedef void ( *DLLFUNC )( HWND, int, int );
DLLFUNC func;
func = GetProcAddress( LoadLibrary( TEXT( "add.dll" ) ) , TEXT( "ADD" ) );
func( hWnd, 5, 5 );
関数のポインタについては検索エンジンなどで調べてみてください。
以下、例です。
#include <stdio.h>
typedef void ( *FUNC )( int, int );
void func( int hoge, int piyo ){
printf( "%d, %d", hoge, piyo );
}
int main(void){
FUNC fn;
fn = func;
fn( 23, 43 );
return 0;
}
参考URL:http://usr_vogel.tripod.co.jp/
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- JavaScript javascriptで入力フォームが空欄の時にアラートによるエラーを出すコードを書いています。 2 2023/06/13 17:58
- Windows 10 IT初心者です! powershellで以下のようなエラーが出ました オブジェクト参照がオブジェクト 1 2023/05/17 11:30
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- Excel(エクセル) エクセルVBA Msgboxでの変数の活用 4 2023/07/23 08:33
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
DLL関数を使ったプログラム
C言語・C++・C#
-
外部依存関係について
C言語・C++・C#
-
DLLをREGSVR32しないで利用する方法について。
Visual Basic(VBA)
-
-
4
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
5
VC++ 2008 EXPRESS _T"識別子がみつかりません"
C言語・C++・C#
-
6
Debug Assertion Failed?
C言語・C++・C#
-
7
_tcscpy_s(wcscpy_s)の第二引数って
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
比較回数と交換回数表示について
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
std::set<int> で、ある値が何...
-
C言語で三目並べをするプログラ...
-
商と剰余を同時に求める(C言語)
-
if と配列の組み合わせ
-
【C++】関数ポインタの使い方
-
並列プログラミングのπ計算につ...
-
c言語
-
HANDLEて何ですか?
-
read関数をノンブロッキングで...
-
卒業研究でよく分からないとこ...
-
DLLをGetProcAddress()で実行で...
-
GlobalAllocの変数を関数に引き...
-
シグマ公式・・・C言語
-
ファイルから読みこむ方法
-
c言語の問題です
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語 配列と関数の練習問題
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
c言語
-
足して100になるような乱数のア...
-
C言語初心者です、、、お助けく...
-
数字列を3桁ごとにカンマで区切...
-
C言語 エラーの原因がわからな...
-
実数の整数部,小数部の取得
-
課題でつまってます・・・
-
商と剰余を同時に求める(C言語)
-
C言語の配列をC++のvectorに高...
-
std::set<int> で、ある値が何...
おすすめ情報