0

LoadLibraryを使用してqtにDLLをロードしようとしています(QLibraryではなくテスト用のみ)、dllはEclipse CDTでコンパイルされましたが、奇妙なことに、DLL内の関数でクラスをインスタンス化しようとすると、LoadLibraryがエラー127で失敗します(GetLastErrorを使用)が、LoadLibraryが正常にインスタンス化されない場合、なぜこれが発生するのですか?私のコードは次のヘッダーとあなたの実装です:

ヘッダ:

#ifndef DESKTOPWINUTILS_H_
#define DESKTOPWINUTILS_H_
#ifdef __dll__
#define DESKTOPUTILSEXP __declspec(dllexport)
#else
#define DESKTOPUTILSEXP __declspec(dllimport)
#endif  // __dll__
#include <iostream>
#include <stdio.h>
#include <string.h>
#include "ximage.h"
#include "IDesktopUtils.h"
class DesktopUtils:public IDesktopUtils{
public:
    DesktopUtils();
    ~DesktopUtils(void);
    char* sayHello();
};
extern "C" DESKTOPUTILSEXP bool create(IDesktopUtils**);
#endif /* DESKTOPWINUTILS_H_ */

実装:

#define __dll__
#include "DesktopUtils.h"

DesktopUtils::DesktopUtils(){
    sayHello();
}

char* DesktopUtils::sayHello(){
    return (char *)("I say Hello");
}


bool create(IDesktopUtils** desktoputils){
    //DesktopUtils *desktoputils = new DesktopUtils();
    if(!desktoputils)
        return false;
    *desktoputils =(IDesktopUtils*) new DesktopUtils; //if comment this the load is successful
    return true;
}

qtプロジェクトでは、これをDLLのロードに使用します。ロードされているかどうかを知るためだけに、GetProcAddressを使用していません。

typedef char*(*createInst)(void);
    HINSTANCE dll;
    dll = LoadLibrary(TEXT("libDesktopWinUtils.dll"));
    if(dll){
        message.setText("library loaded");
        message.exec();

    }else{
        char error[10];
        itoa(GetLastError(),error,10);
        message.setText(error);
        message.exec();
    }
4

1 に答える 1

1

コメントアウトしているコードは、システムが解決できない依存関係を作成しているようです。たとえば、を使用するコードではnew、new のシステム実装が既にプロセスにロードされているか、それを提供する DLL を見つけてロードできる必要があります。それができない場合、LoadLibrary 呼び出しは失敗します。

不足している依存関係を把握する方法:

  • ロードおよびアンロードされたすべてのモジュールをログに記録するデバッガーでプログラムを実行します。
  • 依存関係ウォーカー プログラムを使用します。(SxS がプロセスを複雑にした現在、これらはまれです。)
  • プログラムの実行中に Process Monitor などを実行します。これにより、どの DLL がどこで検索されているかが正確に示されます。
于 2012-10-10T17:47:07.100 に答える