Apple IDログイン機能メンテナンスのお知らせ

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;
}

お願いします。

A 回答 (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/
    • good
    • 0
この回答へのお礼

返信送れてすいません。
ありがとうございました。
おかげでうまくいきました。

お礼日時:2003/02/20 12:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています