2011-08-09 46 views
2

ヘルプ、してください。 Aにはdllファイルがあります。私はそれが関数とパラメータであることを知っています。 EclipseでMinGWを使うにはどうすればいいですか?C++でヘッダーなしのDLLを使用する方法

+0

[LoadLibrary関数](HTTP: //msdn.microsoft.com/en-us/library/ms684175\(v=vs.85\).aspx)[GetProcAddress](http://msdn.microsoft.com/en-us/library/ms683212 \ (v = vs.85 \)。aspx)を使用することができます。 – user786653

+1

これらのツールを使用して入札を行うことは、常に苦労しています。それがすべてであれば、それは常に文書化されていません。あなたが成功した後、あなたは5年後まで、どのように忘れてしまいます。等々。静的にリンクする場合(ここでは、リンカが参照を追加し、DLLバインディングを実行することを意味します)、モジュール定義ファイルを調べることから始めます。おそらくあなたのツールチェーンがそれらをサポートしています。 –

+1

多くの場合、_the_ヘッダには機能名とパラメータはありませんが、最も簡単な解決策は_a_ヘッダを自分で書くことです。 (呼び出し規約も知っておく必要がありますが、それはどんな場合でも必要です) – MSalters

答えて

5

私はあなたがウィンドウを使用していると仮定しています。 WINAPIには、LoadLibraryGetProcAddressの機能があります。ここにはexampleの使用方法があります

+0

静的ライブラリの場合のように、dllへのパスをコンパイラプロパティや他の場所に追加することはできません。 – Country

+0

@Country:おそらくhttp://www.mingw.org/wiki/CreateImportLibrariesは – user786653

+0

を助けます@Country静的ライブラリは何を呼び出すべきかを知るためにヘッダを必要とします。 – Deanna

0

適切な.LIBファイルがあり、関数プロトタイプが正確であれば、ヘッダーは必要ありません。関数を自分で宣言するだけで(おそらく独自のカスタムヘッダーに)。これらの関数を直接呼び出します。 .LIBファイルとリンクします。 DLLはOSによってロードされ、関数が呼び出されます。

DLLにリンクする.LIBファイルがない場合は、LoadLibraryGetProcAddressを使用する必要があります。

1

私はあなたがDLL関数の署名を知っていることを理解しており、ヘッダーはありません。知られている署名と与えられた関数dll_functionについては

long dll_function(long, long, char*, char*); 

次のC++のコードでexamplifiedのようにあなたは、WindowsのAPIからLoadLibraryGetProcAddressを使用することができます。

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

typedef long(__stdcall *f_funci)(long, long, char*, char*); 


struct dll_func_args { 
    long arg1; 
    long arg2; 
    std::string arg3; 
    std::string arg4; 
}; 

// Borrowing from https://stackoverflow.com/a/27296/832621 
std::wstring s2ws(const std::string& s) 
{ 
    int len; 
    int slength = (int)s.length() + 1; 
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len]; 
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len); 
    std::wstring r(buf); 
    delete[] buf; 
    return r; 
} 

int main() 
{ 
    std::string filename = "C:\\...\\mydllfile.dll"; 
    dll_func_args args; 
    args.arg1 = 1; 
    args.arg2 = 2; 
    args.arg3 = "arg3"; 
    args.arg4 = "arg4"; 

    std::wstring tmp = s2ws(filename); 
    HINSTANCE hGetProcIDDLL = LoadLibrary(tmp.c_str()); 

    if (!hGetProcIDDLL) 
    { 
     std::cerr << "Failed to load DLL" << std::endl; 
     return EXIT_FAILURE; 
    } 

    // resolve function address here 
    dll_func_ptr func = (dll_func_ptr)GetProcAddress(hGetProcIDDLL, "dll_function"); 
    if (!func) 
    { 
     std::cout << "Failed to load function inside DLL" << std::endl; 
     return EXIT_FAILURE; 
    } 

    std::cout << "Return value " << func(args.arg1, args.arg2, (char *)args.arg3.c_str(), (char *)args.arg4.c_str()) << std::endl; 

    return EXIT_SUCCESS; 
} 
関連する問題