Сборка DLL C++ Builder 6.0
Тестовый пример.
Заголовочный файл:
#define _Unit1_h
#ifdef __DLL__
#define DLL_EI __declspec(dllexport)
#else
#define DLL_EI __declspec(dllimport)
#endif
void DLL_EI __stdcall test();
#endif
Файл реализации:
#pragma hdrstop
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) {
return 1;
}
#include "Unit1.h"
void __stdcall test() {
;
}
Вызов функции из VFP:
=test()
Не может найти функцию test (can't find entry point test in DLL).
Смотрим структуру собранной DLL, к примеру, через утилиту impdef:
Содержимое project1.def:
EXPORTS
@test$qv @1 ; test()
___CPPdebugHook @2 ; ___CPPdebugHook
Читаю статью, начинаю играть опциями компилятора и линковщика.
Изменение опций: calling convention, don't mangle code modifiers - ничего дает, функция все равно с "искаженным" названием.
Уже отчаялся, подскажите, что делаю не так? Заранее благодарен.
Необходимо собрать DLL-библиотеку, функции которой будут использоваться, к примеру, в VFP.
Тестовый пример.
Заголовочный файл:
#define _Unit1_h
#ifdef __DLL__
#define DLL_EI __declspec(dllexport)
#else
#define DLL_EI __declspec(dllimport)
#endif
void DLL_EI __stdcall test();
#endif
Файл реализации:
#pragma hdrstop
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) {
return 1;
}
#include "Unit1.h"
void __stdcall test() {
;
}
Вызов функции из VFP:
=test()
Не может найти функцию test (can't find entry point test in DLL).
Смотрим структуру собранной DLL, к примеру, через утилиту impdef:
Содержимое project1.def:
Читаю статью, начинаю играть опциями компилятора и линковщика.
Изменение опций: calling convention, don't mangle code modifiers - ничего дает, функции все равно с "искаженными" названиями функция.
Уже отчаялся, подскажите, что делаю не так? Заранее благодарен.
Укажи, что твоя функция export
Укажи, что твоя функция export
Так в заголовочном ведь присутствует директива __declspec(dllexport), функция экспортируется, но с "искаженным" именем. Или я не о том? :-)
Проблема именно в доступе к функции из не C-подобного языка. Динамическое связывание DLL-библиотеки на C++ в том же Builder-е работает нормально:
#include <stdio.h>
#pragma hdrstop
#pragma argsused
int main(int argc, char* argv[]) {
void (*test)();
HINSTANCE dllp = LoadLibrary("project1.dll");
if (dllp) {
test = (void(*) ())
GetProcAddress(dllp, "_test");
if (test)
test();
else
printf("test not found.");
}
FreeLibrary(dllp);
return 0;
}
Так в заголовочном ведь присутствует директива __declspec(dllexport), функция экспортируется, но с "искаженным" именем. Или я не о том? :-)
Проблема именно в доступе к функции из не C-подобного языка. Динамическое связывание DLL-библиотеки на C++ в том же Builder-е работает нормально:
#pragma hdrstop
#pragma argsused
int main(int argc, char* argv[]) {
void (*test)();
HINSTANCE dllp = LoadLibrary("project1.dll");
if (dllp) {
test = (void(*) ())
GetProcAddress(dllp, "_test");
if (test)
test();
else
printf("test not found.");
}
FreeLibrary(dllp);
return 0;
}
В DLL могут входить как экспортируемые функции, так и внутренние. В данном случае у тебя тест объявлена как внутренняя. Укажи явно что она является export
В DLL могут входить как экспортируемые функции, так и внутренние. В данном случае у тебя тест объявлена как внутренняя. Укажи явно что она является export
Гм... разницу между внутренними функциями DLL и экспортируемыми понимаю, как и то, что спецификаторы _export и __declspec(dllexport) идентичны. Второй вариант - мой.
Функция test объявлена как экспортируемая (см. внимательно заголовочный файл), после раскрытия маркоса DLL_EI будет:
Гм... разницу между внутренними функциями DLL и экспортируемыми понимаю, как и то, что спецификаторы _export и __declspec(dllexport) идентичны. Второй вариант - мой.
Функция test объявлена как экспортируемая (см. внимательно заголовочный файл), после раскрытия маркоса DLL_EI будет:
У тебя проблема скорее всего с декорацией имен,я бы в VisualStudio C++ зделал бы так:
не знаю действует ли такое билдере
У тебя проблема скорее всего с декорацией имен,я бы в VisualStudio C++ зделал бы так:
не знаю действует ли такое билдере
Именно так надо писать и в C++Builder.
Вот только в VFP, скорее всего, при объявлении надо поставить подчерк перед test, то есть
=test()
О, помогло. :-)
Два ньюанса:
1. Таки директивы _export и __declspec(dllexport), насколько понял, идентичны. Итого, сработал вариант:
Благодарю, господа. :-)