これは初心者の質問のように感じるので、それがだまされている場合は、正しい場所を教えてください:)
Cで書いたDLLをC++プログラムに入れてみました。それは機能しませんでした。gccは言った
test.cpp:xxx:エラー:引数が多すぎて機能しません。
最小限の作業例を次に示します。
DLL関数のラッパー:
/* myWrapper.h */
#ifndef _MYWRAPPER_H
#define _MYWRAPPER_H
#include <windows.h>
#ifdef __cplusplus
extern "C" {
#endif
extern FARPROC EXPORTED_functionNameP;
int GetDLLpointers();
#ifdef __cplusplus
}
#endif
#endif
その実装:
/* myWrapper.c */
#include <windows.h>
#include "myHeader.h"
#ifdef __cplusplus
extern "C" {
#endif
HINSTANCE drvsHANDLE;
extern FARPROC EXPORTED_functionNameP;
int GetDLLpointers()
{
static int result;
drvsHANDLE = LoadLibrary("myLibrary.dll");
if (drvsHANDLE == NULL) return (result=0);
EXPORTED_functionNameP = GetProcAddress(
drvsHANDLE, "originalFunctionName");
if (EXPORTED_functionNameP == NULL) return (result = 0);
return (result = 1);
}
#ifdef __cplusplus
}
#endif
当然、私はこれらもライブラリも自分で書いたわけではありません。できれば、すべて手つかずのままにしておくことをお勧めします。ただし、行を追加しましたextern "C"
。
次に、私のメインファイル:
// my Main
#include <windows.h>
#include "myHeader.h"
int main(int argc, char **argv)
{
int arg = 1;
EXPORTED_functionNameP(arg);
return 0;
}
ビルドコマンド:
gcc -I. -c -o myHeader.o myHeader.c -L. -lmyLibrary
g++ -I. -o main.exe myMain.cpp myHeader.o -L. -lmyLibrary
を有効なCに書き直して、の代わりにでmain.cpp
コンパイルすると、正常に動作します。gcc
g++
私はアベイルズに変更しようとしextern "C"
ましextern "C++"
た、私はすべての順列を試しました、またはgcc
2g++
つのビルドコマンドについては何もしませんでした。
名前マングリングと関係があることは知っていgcc
ますが、extern "C"
行を含めるとそれで大丈夫だと思いました...誰かが私がここで欠けているものを説明してもらえますか?
重要な場合-
Windows XP Pro(後でWin7になります)
(MinGW)gcc 4.6.2