c++ - 如何在 Delphi 中使用 C++ 对象

标签 c++ visual-studio delphi dll

我正在为 Visual Studio 中的 Delphi 应用程序制作一个 DLL 文件。我正在关注 http://rvelthuis.de/articles/articles-cppobjs.html制作dll的链接。我的代码如下

DLL_CLASS.h

#pragma once


using namespace std ;
#include "stdafx.h"
class DLL_CLASS
{

    private:

    public:
        int TestValue;
        char*  getConnectedInverters (char* path);
         char*  getInverterParameters (int Device_Handle);
         char*  getInverter_SPOT_READINGS(int Device_Handle);
         char*  getPassword_varification();
         char*  get_Inverter_password();
         char*  get_Device_name(int Device_handle);
         int    get_Device_handel();
         char*  setAllInverterParameters(int Device_Handle,char* path_to_XML);
        char*  setYasdi_Reset_and_Shutdown();
         char*  get_Encryption(char* string_to_encrypt);
         char*  deviceXmlname();
         char*  RegExp(string Device_type);
        int Get_inst_code_Channel(int Device_Handle);
         char*  set_One_InverterParameters(int Device_Handle,int Channel_handle,string Value);

          DLL_CLASS();
        virtual ~DLL_CLASS();
};

其他文件代码如下

#include "stdafx.h"
#include "DLL_CLASS.h"
#include <tchar.h>
#include <windows.h>;




// define a macro for the calling convention and export type
#define EXPORTCALL __declspec(dllexport) __stdcall
typedef DLL_CLASS *ConsoleHandle;
extern "C"
{

    ConsoleHandle EXPORTCALL NewConsole(void)
    {
        return new DLL_CLASS();
    }

    void EXPORTCALL DeleteConsole(ConsoleHandle handle)
    {
        delete handle;
    }

    char* EXPORTCALL NEW_getConnectedInverters(ConsoleHandle handle ,char* path)
    {
        handle->getConnectedInverters (path);
    }

    char* EXPORTCALL NEW_getInverterParameters (ConsoleHandle handle ,int Device_Handle)
    {
        handle->getInverterParameters(Device_Handle);
    }

    char* EXPORTCALL NEW_getInverter_SPOT_READINGS(ConsoleHandle handle,
        int Device_Handle)
    {
        handle->getInverter_SPOT_READINGS(Device_Handle);
    }

    char* EXPORTCALL NEW_getPassword_varification(ConsoleHandle handle)
    {
        handle->getPassword_varification();
    }

    char* EXPORTCALL NEW_get_Inverter_password(ConsoleHandle handle)
    {
        handle->get_Inverter_password();
    }

    char* EXPORTCALL NEW_get_Device_name(ConsoleHandle handle,
        int Device_handle)
    {
        handle->get_Device_name(Device_handle);
    }

    int EXPORTCALL NEW_get_Device_handel(ConsoleHandle handle)
    {
        return handle->get_Device_handel();
    }

    char* EXPORTCALL NEW_setAllInverterParameters(ConsoleHandle handle,int Device_Handle,char* path_to_XML)
    {
        return handle->setAllInverterParameters( Device_Handle, path_to_XML);
    }

    char* EXPORTCALL NEW_setYasdi_Reset_and_Shutdown(ConsoleHandle handle)
    {
        handle->setYasdi_Reset_and_Shutdown();
    }

    char* EXPORTCALL NEW_get_Encryption(ConsoleHandle handle,
        char* string_to_encrypt)
    {
        handle->get_Encryption(string_to_encrypt);
    }
    char* EXPORTCALL NEW_deviceXmlname(ConsoleHandle handle)
    {
        handle->deviceXmlname();
    }
    char* EXPORTCALL RegExp(ConsoleHandle handle,
        string Device_type)
    {
        handle->RegExp( Device_type);
    }
    char* EXPORTCALL NEW_set_One_InverterParameters(ConsoleHandle handle,
        int Device_Handle,int Channel_handle,string Value)
    {
        handle->set_One_InverterParameters( Device_Handle,Channel_handle, Value);
    }
    int  EXPORTCALL NEW_Get_inst_code_Channel(ConsoleHandle handle,
        int Device_Handle)
    {
        handle->Get_inst_code_Channel(Device_Handle);
    }
} // extern "C"

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}

但这给我错误如下

1>------ Build started: Project: inverter_library, Configuration: Release Win32 ------
1>  flatten.cpp
1>flatten.cpp(5): warning C4067: unexpected tokens following preprocessor directive - expected a newline
1>flatten.cpp(26): error C2059: syntax error : '__declspec(dllexport)'
1>flatten.cpp(27): error C2143: syntax error : missing ';' before '{'
1>flatten.cpp(27): error C2447: '{' : missing function header (old-style formal list?)
1>flatten.cpp(31): error C2059: syntax error : '__declspec(dllexport)'
1>flatten.cpp(32): error C2143: syntax error : missing ';' before '{'
1>flatten.cpp(32): error C2447: '{' : missing function header (old-style formal list?)
1>flatten.cpp(36): error C2059: syntax error : '__declspec(dllexport)'
1>flatten.cpp(38): error C2143: syntax error : missing ';' before '{'
1>flatten.cpp(38): error C2447: '{' : missing function header (old-style formal list?)
1>flatten.cpp(42): error C2059: syntax error : '__declspec(dllexport)'
1>flatten.cpp(43): error C2143: syntax error : missing ';' before '{'
1>flatten.cpp(43): error C2447: '{' : missing function header (old-style formal list?)
1>flatten.cpp(47): error C2059: syntax error : '__declspec(dllexport)'
1>flatten.cpp(48): error C2143: syntax error : missing ';' before '{'
1>flatten.cpp(48): error C2447: '{' : missing function header (old-style formal list?)
1>flatten.cpp(52): error C2059: syntax error : '__declspec(dllexport)'
1>flatten.cpp(54): error C2143: syntax error : missing ';' before '{'
1>flatten.cpp(54): error C2447: '{' : missing function header (old-style formal list?)
1>flatten.cpp(63): error C2059: syntax error : '__declspec(dllexport)'
1>flatten.cpp(64): error C2143: syntax error : missing ';' before '{'
1>flatten.cpp(64): error C2447: '{' : missing function header (old-style formal list?)
1>flatten.cpp(68): error C2059: syntax error : '__declspec(dllexport)'
1>flatten.cpp(69): error C2143: syntax error : missing ';' before '{'
1>flatten.cpp(69): error C2447: '{' : missing function header (old-style formal list?)
1>flatten.cpp(73): error C2059: syntax error : '__declspec(dllexport)'
1>flatten.cpp(75): error C2143: syntax error : missing ';' before '{'
1>flatten.cpp(75): error C2447: '{' : missing function header (old-style formal list?)
1>flatten.cpp(78): error C2059: syntax error : '__declspec(dllexport)'
1>flatten.cpp(79): error C2143: syntax error : missing ';' before '{'
1>flatten.cpp(79): error C2447: '{' : missing function header (old-style formal list?)
1>flatten.cpp(82): error C2059: syntax error : '__declspec(dllexport)'
1>flatten.cpp(84): error C2143: syntax error : missing ';' before '{'
1>flatten.cpp(84): error C2447: '{' : missing function header (old-style formal list?)
1>flatten.cpp(87): error C2059: syntax error : '__declspec(dllexport)'
1>flatten.cpp(89): error C2143: syntax error : missing ';' before '{'
1>flatten.cpp(89): error C2447: '{' : missing function header (old-style formal list?)
1>flatten.cpp(99): warning C4068: unknown pragma
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

谁能告诉我为什么会出现这个错误

我试图找到解决方案,但找不到......

最佳答案

您需要在返回值之前放置__declspec(dllexport),在返回值之后放置__stdcall。例如:

__declspec(dllexport) int __stdcall foo(...)

您的宏将它们放在一起,在函数返回值之后。因此语法错误。因此,如果您希望两者都在一个宏中,则需要一个将返回类型作为参数的参数化宏。

在我看来,明确并跳过宏并手写出来更简单明了。我建议您避免使用宏,除非它们与非宏替代方案相比具有显着优势。在这种情况下,我看不到这样的好处。

请注意,您的某些展平函数缺少 return 语句。您还需要清楚返回的 char* 指针的生命周期。我相信您已经掌握了这一点。

关于c++ - 如何在 Delphi 中使用 C++ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16955597/

相关文章:

c++ - 用 C++ 等效项替换 C 内存映射

c# - 将 C# 应用程序中使用的文件夹放在哪里?

c++ - 使用 autoexp.dat 和 DLL 扩展 Visual Studio 2003 C++ 调试器

windows - EOLN 中的 Delphi 2006 错误

delphi - 小型命令行脚本编写器(如 Autocad 命令)单行编辑器

打开屏幕保护程序的 Delphi 代码在 Windows 7 中不起作用

c++ - 在压缩文本文件中快速搜索

c++ - LNK2019,LPCTSTR和C++语法概述

c++ - 错误 : expected nested-name-specifier before 'xxx'

c# - OAuth2.0如何与OData Client Code Generator集成?