2013-06-06 2 views
3

Я делаю DLL-файл для приложения delphi в визуальной студии. Я следую http://rvelthuis.de/articles/articles-cppobjs.html ссылке, чтобы сделать код dll.My следующимКак использовать объекты C++ в Delphi

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

Может кто-нибудь предложить мне Почему эта ошибка наступает

Я пытался найти решение, но я не мог найти его ....

+0

неправильный вызов и экспорт макроса. начинайте отсюда http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL –

+0

Какое отношение это имеет к Delphi? Этот вопрос называется и помечен неверно. –

ответ

2

Вы должны поместить __declspec(dllexport) до возвращаемого значения, а __stdcall после возвращаемого значения. Например:

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

Ваш макрос помещает их вместе после возвращаемого значения функции. Отсюда и синтаксическая ошибка. Поэтому, если вы хотите как в одном макросе, вам нужен параметризованный макрос, который принимает тип возвращаемого значения в качестве параметра.

Проще и яснее, чтобы быть явным и пропускать макросы и записывать его вручную, на мой взгляд. Я предлагаю вам избегать макросов, если они не принесут существенных преимуществ по сравнению с альтернативами, отличными от макросов. В этом случае я не вижу такой выгоды.

Обратите внимание, что некоторые из ваших функций сглаживания отсутствуют. И вам также необходимо четко указать время жизни указателей char*, которые вы возвращаете. Надеюсь, вы уже на высоте.

+0

Макрос в вопросе такой же, как макрос в статье Руди. Может быть, синтаксис действителен для C++ Builder, но не для Visual C++? Если это так, то макрос определенно будет полезен. Условно определите макрос в соответствии с средой компиляции, а затем используйте этот макрос, чтобы сделать все объявления правильными, вместо условного определения каждой функции по отдельности. –

+0

@RobKennedy C++ Builder примет синтаксис MSVC, поэтому я не думаю, что необходима условная работа. –

Смежные вопросы