0

好的,所以我正在尝试为另一个可以使用GetProcAddress.

因此,我在 VS2012 C++ Express(下面的标题和源代码)中构建了 DLL,NULL即使 dll 与 exe 位于同一文件夹中,它也会返回。所以这让我相信这个dllmain功能有问题。于是我开始翻阅MSDN,发现如下链接

http://msdn.microsoft.com/en-us/library/vstudio/988ye33t.aspx

它指出,当我创建 dll 模板时,它已经照顾好我,我按照这个 MSDN 链接做了。

http://msdn.microsoft.com/en-us/library/ms235636%28v=vs.80%29.aspx

所以我决定尝试在发布模式下构建 DLL(考虑这可能是问题所在),但我得到一个链接器错误,说必须定义入口点。它在调试模式下构建良好,但在发布模式下却不行。我假设我在这里遗漏了一些简单的东西。

Error   1   error LNK1561: entry point must be defined  C:\Users\ProRip\Documents\Visual Studio 2012\Projects\PhantomAdapter\AdapterDLL\LINK    AdapterDLL

标题

#ifdef PHANTOMADAPTER_EXPORTS
#define PHANTOMADAPTER_API __declspec(dllexport)
#else
#define PHANTOMADAPTER_API __declspec(dllexport)
#endif
#using <mscorlib.dll>
#using <system.dll>
using namespace System; 
using namespace System::IO::Ports;
using namespace System::Threading;
namespace PhantomAdapter
{


class PhantomAdapter
{
public:
    static PHANTOMADAPTER_API int open();
    static PHANTOMADAPTER_API int close();
    //static PHANTOMADAPTER_API double init(bool );
    //static PHANTOMADAPTER_API int noDevices();
    static PHANTOMADAPTER_API int angle(double& angle);
    static PHANTOMADAPTER_API int torque(double torque);
    static PHANTOMADAPTER_API int ready();
};
public ref class SerialPort
{
private:
    static System::IO::Ports::SerialPort^ p1;
public:
    static int openPort();
    static void closePort();
    static int read();
    static void send(Byte data);
    static int check();
};

}

资源

#include "stdafx.h"


#include "stdafx.h"
#include "PhantomAdapter.h"
#include <stdexcept>

using namespace std;



namespace PhantomAdapter
{

    int PhantomAdapter::open()
    {
        int flag=0;

        flag=SerialPort::openPort();
        return flag;

    }

    int PhantomAdapter::close()
    {
        SerialPort::closePort();

        return 1;
    }

    int PhantomAdapter::angle(double& angle)
    {
        SerialPort::send(0x82);
        angle = (SerialPort::read() * 255) + (SerialPort::read());
        angle = angle*(6.2832/512);

        return 1;
    }

    int PhantomAdapter::torque(double torque)
    {
        return 1;
    }

    int PhantomAdapter::ready()
    {
        return SerialPort::check();
    }

    int SerialPort::openPort()
    {       
        bool check=0;
        p1 = gcnew System::IO::Ports::SerialPort();

        p1->BaudRate = 57600;
        p1->PortName = "COM3";
        if(p1->IsOpen)
          return 0;
        else {
            p1->Open();
            return 1;
        }

    }

    int SerialPort::check()
    {
        array<String^>^ serialPorts = nullptr;
        int flag=0;
        serialPorts = p1->GetPortNames();

        for each(String^ port in serialPorts)
        {
            if(port=="COM3")
                flag=1;             
        }

        return flag;
    }

    void SerialPort::closePort()
    {
        p1->Close();
    }

    void SerialPort::send(Byte data)
    {
         array<unsigned char>^ buffer = gcnew array<Byte>(1);

        buffer[0] = (char)data;
        p1->Write(buffer,0,1);  
    }

    int SerialPort::read()
    {
        return p1->ReadByte();
    }
}
4

2 回答 2

1

在您的 VS 项目中,您可以检查设置:
1. Configuration Properties > General > Configuration Type? 这是.dll在发布模式的情况下设置的吗?
2. Configuration Properties > Linker > System > SubSystem? 这两种模式之间是否相同?

于 2013-10-04T04:46:56.863 回答
0

您不能通过 LoadLibrary/GetProcAddress 从本机代码调用 .NET 方法(并且 C++/CLI 方法是 .NET 方法)。.NET 方法和类不会以这种方式导出。您将始终得到一个 NULL 指针。

你可以做什么:

  • 在 .NET 中编写一个 COM 组件以在普通 C++ 中引用

  • 导出仅在内部调用 .NET 代码的普通、纯 C++ 方法

  • Assembly使用类及其方法将托管 dll 导入托管(相同的 C++/CLI 或 C# 或任何其他 .NET 语言)可执行文件。

于 2013-10-04T05:32:19.497 回答