1

誰かがこのコードで私を助けることができますか?

.Dll で宣言したメソッドを使用したい...これらのメソッドのうち 2 つを使用できますが、そのうちの 1 つが多くの頭痛の種になっています...次のコードに従ってください。

main.h -> DLL

 #ifndef _DLLTEST_H_
 #define _DLLTEST_H_

 #include <iostream>
 #include <stdio.h>
 #include <windows.h>

 extern "C" __declspec(dllexport) void NumberList();
 extern "C" __declspec(dllexport) void LetterList();
 extern "C" __declspec(dllexport) int sumNumber(int, int);


 #endif

main.cpp -> DLL

 #include "main.h"

 #define MAXMODULE 50

using namespace std;

 char module[MAXMODULE];


 extern "C" __declspec(dllexport)

 void NumberList() {

       GetModuleFileName(NULL, (LPTSTR)module, MAXMODULE);

       cout << "\n\nThis function was called from "
            << module
            << endl << endl;

       cout << "NumberList(): ";


       for(int i=0;  i<10; i++) {

            cout << i << " ";
       }

       cout << endl << endl;

 }



 extern "C" __declspec(dllexport)

 void LetterList() {

       GetModuleFileName(NULL, (LPTSTR)module, MAXMODULE);

       cout << "\n\nThis function was called from "
            << module
            << endl << endl;

       cout << "LetterList(): ";


       for(int i=0;  i<26; i++) {

            cout << char(97 + i) << " ";
       }

       cout << endl << endl;
 }


extern "C" __declspec(dllexport)

int sumNumber(int i, int j) {


    cout << "Number: " << i + j << endl;

    return i+j;
}

.DLL のテスト

#define MAXMODULE 50

using namespace std;

 typedef void (WINAPI*cfunc)();

 cfunc NumberList;
 cfunc LetterList;
 cfunc sumNumber;

 int main() {

       HINSTANCE hLib=LoadLibrary("libCriandoDLL.dll");


       if(hLib==NULL) {

            cout << "Unable to load library!" << endl;
            getch();
       }

       char mod[MAXMODULE];

       GetModuleFileName((HMODULE)hLib, (LPTSTR)mod, MAXMODULE);
       cout << "Library loaded: " << mod << endl;


       NumberList=(cfunc)GetProcAddress((HMODULE)hLib, "NumberList");
       LetterList=(cfunc)GetProcAddress((HMODULE)hLib, "LetterList");
       sumNumber=(cfunc)GetProcAddress((HMODULE)hLib, "sumNumber");

       if((NumberList==NULL) || (LetterList==NULL) || (sumNumber==NULL)) {

            cout << "Unable to load function(s)." << endl;
            FreeLibrary((HMODULE)hLib);
       }


       NumberList();
       LetterList();
       sumNumber(1,1);

       FreeLibrary((HMODULE)hLib);

       getch();
 }

メソッド「NumberList();」および「LetterList ();」完全に動作します...ただし、メソッド「sumNumber (1.1)」を使用しようとすると、「エラー: 機能する引数が多すぎます」というエラーが表示されます。

4

1 に答える 1

2

インポートされた関数はすべて、パラメーターをとらず、戻り値を与えないと宣言しています。

 typedef void (WINAPI*cfunc)();

 cfunc NumberList;
 cfunc LetterList;
 cfunc sumNumber;

sumNumber正しいタイプであることを宣言int (WINAPI*)(int,int)すれば、問題ありません。

于 2013-06-25T16:31:43.693 に答える