3

I am making a DLL file for delphi applicaton in visual studio. I am following http://rvelthuis.de/articles/articles-cppobjs.html link to make the dll.My code is as follows

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();
};

and other file code is as below

#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;
}

But this Give me error as below

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 ==========

Can anyone suggest me Why this error is coming

I tried to find the solution but I could not find it....

2
  • you calling convention and export macro is incorrect. start from here codeproject.com/Articles/28969/… Commented Jun 6, 2013 at 7:19
  • What does any of this have to do with Delphi? This question is titled and tagged incorrectly. Commented Jun 6, 2013 at 18:00

1 Answer 1

2

You need to place the __declspec(dllexport) before the return value, and the __stdcall after the return value. For example:

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

Your macro places them together, after the function return value. Hence the syntax error. So if you want both in a single macro, you need a parameterized macro that takes the return type as a parameter.

It's simpler and clear to be explicit and skip the macros and write it out longhand, in my view. I suggest that you shun macros unless they give significant benefit in comparison to non-macro alternatives. In this case I see no such benefit.

Note that some of your flattening functions are missing return statements. And you also need to be clear on the lifetime of the char* pointers that you return. I trust you are already on top of that.

Sign up to request clarification or add additional context in comments.

2 Comments

The macro in the question is the same as the macro in Rudy's article. Maybe the syntax is valid for C++ Builder, but not for Visual C++? If that's the case, then a macro would definitely be useful: Conditionally define the macro according to the compilation environment, and then use that macro to make all the declarations right, instead of conditionally defining each function separately, longhand.
@RobKennedy C++ Builder will accept the MSVC syntax so I don't think any conditional work is needed.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.