在C ++中构建和使用DLL时遇到问题

时间:2015-10-04 00:33:14

标签: c++ dll

以下是我在运行项目时收到的错误:

No Entry Point error

奇怪的是,这在某一点上起作用。我暂时离开了这个项目,现在它无法正常工作。除了改变一些参数之外,没有太大的变化。

我的设置包括我构建DLL的项目。然后将该项目用于我用于测试它的另一个项目的解决方案中。我按照这个例子:https://msdn.microsoft.com/en-us/library/ms235636.aspx我第一次跟进并让它工作,现在已经停止了。

在意识到它似乎只是造成问题的其中一个函数之后我已经删除了所有额外的代码,尝试重命名该函数,删除其中的所有内容并且它仍然无效。

您可以看到函数定义和签名,以了解我是如何尝试在

下工作的

我也尝试使用我在函数上创建的“SCOREINTERFACECPP”宏而不是类,我得到了同样的错误。

在我正在测试它的项目中,我添加了DLL项目作为参考和依赖项目,然后导入了头文件。我在dll中的其他功能(为了简单起见,我已从此代码中删除)似乎正在工作。

部首:

#ifdef SCOREINTERFACECPP_EXPORTS
#define SCOREINTERFACECPP __declspec(dllexport) 
#else
#define SCOREINTERFACECPP __declspec(dllimport) 
#endif

#include <time.h>
#include <queue>

namespace ScoreInterfaceCPP
{
    class SCOREINTERFACECPP ScoreInterface
    {

    public:

        ScoreInterface();
        ~ScoreInterface();

        static void SubmitLogin(const std::string &displayName, const std::string &password);

        static void Shutdown();

        static SIEvent* GetNextEvent();
        static void ClearEvents();
        static int GetEventCount();

    private:

        static std::queue< SIEvent* > mSIEvents;
        static bool mGameIsAuthorized;
        static std::string mGameName;

        static std::string hexedKey;
        static std::wstring mAddress;

        static void SubmitEventString(std::string eventString);

        static int SubmitWithNewThread(void* data);

        static void PostMessage(std::string data, std::string iv);
    };
}

来源:

#include <sstream>

#include <SDL/SDL_thread.h>
#include <boost/tokenizer.hpp>

#include "ScoreInterfaceCPP.h"
#include "Network.h"

using namespace ScoreInterfaceCPP;

/*
    ScoreInterfaceCPP.h
    Handles the sending and receiving of events.
*/

ScoreInterface::ScoreInterface()
{
}

ScoreInterface::~ScoreInterface()
{
}

void ScoreInterface::SubmitLogin(const std::string &displayName, const std::string &password)
{       
}

void ScoreInterface::SubmitEventString(std::string eventString)
{       
}

int ScoreInterface::SubmitWithNewThread(void* data)
{   
    return 0;
}

SIEvent* ScoreInterface::GetNextEvent()
{   
    return NULL;
}

int ScoreInterface::GetEventCount()
{
    return 0;
}

void ScoreInterface::ClearEvents()
{
}

void ScoreInterface::Shutdown()
{
}

测试文件:

#include "ScoreInterfaceCPP.h"

using namespace ScoreInterfaceCPP;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    ScoreInterface si = ScoreInterface();

    si.SubmitLogin("noplayer", "nopassword");

    return 0;
}

1 个答案:

答案 0 :(得分:1)

根据我的经验,通常这类问题都有两件事需要检查(假设DLL已成功构建):

  1. 检查运行时加载的DLL是否为正确版本。
  2. 确保实际导出有问题的功能。
  3. 对于第一个问题,您可以使用Process Explorer之类的实用程序,并查看为运行的exectuable加载的DLL句柄。如果您使用的是Visual C ++,还可以查看已加载的DLL的1列表,并确保正在加载您正在使用的版本。

    在开发过程中很多时候,您可能有几个(无论是偶然还是设计)版本的DLL位于Windows可访问的目录中(请参阅DLL Search Order),因此可能是旧版本或不同版本的运行应用程序时正在加载DLL。

    对于第二个问题,有while (user_input != "1") and (user_input != "2") and (user_input != "3") : ,但我发现Dependency Walker使用起来更友好一些。这些实用程序将显示从DLL导出的函数。

    如果发现该功能未导出,则需要重建DLL,确保Output Window已用于您要导出的功能或类。