![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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も見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
DLL関数を使ったプログラム
C言語・C++・C#
-
Debug Assertion Failed?
C言語・C++・C#
-
外部依存関係について
C言語・C++・C#
-
-
4
画面を強制的に再描画させる方法
C言語・C++・C#
-
5
CStringをwchar_tに変換したい
C言語・C++・C#
-
6
CloseとDisposeの違い
Visual Basic(VBA)
-
7
VC++ 2008 EXPRESS _T"識別子がみつかりません"
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
std::set<int> で、ある値が何...
-
#define _CRT_SECURE_NO_WARNIN...
-
構造体の勉強中です 合計点の高...
-
c言語の配列を使ってサイコロを...
-
C言語のサイコロシミュレート
-
C言語における対称行列の作り方...
-
C言語の構造体について
-
if と配列の組み合わせ
-
インライン展開されているか確...
-
ファイルから読みこむ方法
-
C言語での引数の省略方法
-
配列に順列を入れ、その順列を...
-
c言語
-
【C++】関数ポインタの使い方
-
「{ } で囲むだけ」は正しい?
-
式は定数値が必要です」という...
-
初項a_0=aとし、漸化式 a_n+1=(...
-
入力された数字を大きい順に並...
-
C言語 エラーの原因がわからな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
c++でテンプレートのコードでわ...
-
(int *)の意味
-
ラップ関数とはどんなものですか?
-
数字列を3桁ごとにカンマで区切...
-
c言語のリダイレクトによる円...
-
比較回数と交換回数表示について
-
実数の整数部,小数部の取得
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
PowerShellがうまくいかない
-
c言語の配列を使ってサイコロを...
-
課題でつまってます・・・
-
C言語のサイコロシミュレート
-
エラー 添字が付けられた値が、...
おすすめ情報