1

IDE を使用せずに、コンソールから DLL をコンパイルしようとしましたが、次のエラーに直面しました。

私はこのコードを書きました:

test_dll.cpp

#include <windows.h>
#define DLL_EI __declspec(dllexport)

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved){
  return 1;
}
extern "C" int DLL_EI func (int a, int b){
  return a + b;
}

次に、 command でコンパイルしicl /LD test_dll.cppます。そして、私はこれfuncを別のプログラムから呼び出そうとしています:

prog.cpp

int main(){
  HMODULE hLib;
  hLib = LoadLibrary("test_dll.dll");  
  double (*pFunction)(int a, int b);
  (FARPROC &)pFunction = GetProcAddress(hLib, "Function");
  printf("begin\n");
  Rss = pFunction(1, 2);
}

でコンパイルしicl prog.cppます。次に、それを実行すると、標準ウィンドウ「プログラムが機能していません」で失敗します。セグメンテーション違反エラーが発生している可能性があります。

私は何を間違っていますか?

4

1 に答える 1

3

両方LoadLibrary()GetProcAddress()成功することを確認してください。この場合、エクスポートされた関数が呼び出されると、引数で指定されたとおりに呼び出されないことは間違いありませfuncん."Function"GetProcAddress()NULL

関数ポインタのシグネチャも、エクスポートされた関数のシグネチャと一致しません。エクスポートされた関数は を返し、int関数ポインタは を期待していdoubleます。

例えば:

typedef int (*func_t)(int, int);

HMODULE hLib = LoadLibrary("test_dll.dll");
if (hLib)
{
    func_t pFunction = (func_t)GetProcAddress(hLib, "func");
    if (pFunction)
    {
        Rss = pFunction(1, 2);
    }
    else
    {
        // Check GetLastError() to determine
        // reason for failure.
    }
    FreeLibrary(hLib);
}
else
{
    // Check GetLastError() to determine
    // reason for failure.
}
于 2013-01-15T08:38:09.537 に答える