1

MFC DLL を作成し、たとえばファイル SerialPort.h に関数をエクスポートしました。

class CSerialPortApp : public CWinApp
{
public:
    CSerialPortApp();

    __declspec(dllexport) int SWrite(unsigned char* toSend, int len);
};

私のMFCアプリケーションでは、SerialInterface.hの関数を呼び出したいので、DLLから「SerialPort.h」を含めて呼び出しました:

__declspec(dllimport) int SWrite(unsigned char* toSend, int len);

class SerialInterface
{
public:

};

例えば。

SerialPort.lib ファイルをリンカー インクルードに追加しましたが、コンパイルしようとすると、

error LNK2001: unresolved external symbol "__declspec(dllimport) int __cdecl SWrite(unsigned char*, int)" (__imp_?SWrite@@YAHPAEH@Z)

この原因について行き詰まっています。すべてを再構築しようとしましたが、何も役に立たないようですか?

助けてくれてありがとう!

4

2 に答える 2

1

クラス内で __declspec(dllexport) を使用していますか?

dll からグローバル関数をエクスポートするか、任意の関数を含むクラス全体をエクスポートします。選択したメンバー関数をクラスからエクスポートする必要はありません。それがどのように機能するかさえわかりません。

(コードに従って) SerialPort クラスを dll から適切にエクスポートしていないのに、アプリケーションでそれを使用してそのメンバー関数を呼び出すことができるのは少し奇妙です!? 私は少し混乱しています。

于 2011-10-06T17:52:00.827 に答える
0

うまくいく代替手段を見つけましたが、それを間違って実装していたと思います。

CWinApp クラスではない新しいクラスを DLL に追加しました。

class SerialPort
{
public:
    __declspec(dllexport) SerialPort(void);
    __declspec(dllexport) virtual ~SerialPort(void);

    __declspec(dllexport) int SWrite(unsigned char* toSend, int len);
};

次に、このヘッダーをアプリケーションと lib および dll などに含めました。

次に、インクルードされたヘッダー ファイルをメインの CDialog ヘッダーに配置しましたが、重要なことに、関数をインポートする必要はありませんでした。

#include "SerialPort.h"

class CPPUDlg : public CDialog
{
public:
    CPPUDlg(CWnd* pParent = NULL); // standard constructor

    SerialPort objSerialPort;

そして、私のコードでは、単に呼び出します

objSerialPort.SWrite(toSend, len);

必要だと思っていた関数をインポートするために dllimport を使用していませんでしたが、今では機能しています。

これが、同様の問題を抱えている可能性のある人に役立つことを願っています。

于 2011-10-05T10:08:00.110 に答える