Форум программистов, компьютерный форум CyberForum.ru

Написание dll - библиотеки и ее открытие средствами Delphi - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Тест по c++ http://www.cyberforum.ru/cpp-beginners/thread978926.html
Помогите зарешать тест, буду признателен
C++ Задача про лотосы: за сутки каждый лотос делится пополам. Определить сколько будет через месяц. Решите задачи на C++(в виде кода программы) 1.В озере растут лотосы. За сутки каждый лотос делится пополам, и вместо одного лотоса появляются два. Ещё через сутки каждый из получившихся лотосов делится пополам и так далее. Через 30 суток озеро полностью покрылось лотосами. Через какое время озеро было заполнено наполовину? http://www.cyberforum.ru/cpp-beginners/thread978918.html
C++ Альтернативный способ решения
Приветствую всех программистов, зашедших в эту тему. В общем, начну с условия задачи: "Написать программу объединения трех строк “The laboratory”, “work” и “№6” в четвертую строку с текстом: «The laboratory work №6» без использования функции sprintf()" Задачу эту я решил, использовав strcat. Всё работает, НО дотошный препод требует, чтобы я её решил альтернативным способом....
Целочисленное деление C++
Почему ноль получается?? Я понимаю, что o и p целочисленные. НО P ведь нет. почему ноль? int main() { int o=5; int n =10; float P; P = o/n; cout << P; return 0;
C++ Создать аналог функции strpbrk на С++ http://www.cyberforum.ru/cpp-beginners/thread978875.html
Здравствуйте, прошу о помощи. Дано задание сделать аналог функции strpbrk на С++, чтобы работало аналогично этой задачи, только сделано другими операторами. #include <string.h> #include <stdio.h> int main( void ) { char string = "The 3 men and 2 boys ate 5 pigs\n"; char *result = NULL; // Return pointer to first digit in "string".
C++ Ошибка error LNK2019: unresolved external symbol char * Добрый день! Помогите разобраться с ошибкой, не пойму что именно она значит. Заранее спасибо error LNK2019: unresolved external symbol "char * __cdecl get_substr(char *,char *)" (?get_substr@@YAPADPAD0@Z) referenced in function _main #include "stdafx.h" #include <iostream> using namespace std; подробнее

Показать сообщение отдельно
Akylax
15 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 93
16.10.2013, 14:40     Написание dll - библиотеки и ее открытие средствами Delphi
Есть некоторая dll-библиотека, которая вычисляет площадь и периметр n-угольника. Лабораторная была на Delphi, решил попробовать написать dll-ку средствами языка C++ (на Visual Studio)
На msdn, нашел алгоритм написания:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//Simple.h
namespace dllspace{
    #define M_PI 3.1415926535897932384626433832795
    class dllclass
    {
    public:
        static __declspec(dllexport) double Square(double n, double b);
            
    public:
        static __declspec(dllexport) double Perimeter(double n, double b);
    };
}
//SimpleCPP.cpp
#include <math.h>
#include <stdexcept>
#include "SimpleH.h"
namespace dllspace
    {
     double dllclass::Square(double n, double b)
            {
             return( (1/4)*n*b*b*(1/tan(M_PI/n)));
            } 
    double dllclass::Perimeter(double n, double b)
        {
        return (n*b);
        }
    }
Открываю в приложении, которое динамически(т.е. в процессе выполнения) загружает dll-ку. Приложение 100% работает, если использовать dll-ку собранную в delphi.
P.S. Использовал соглашение cdecl
Кликните здесь для просмотра всего текста

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//Polygon.dll
library Polygon;
 
uses
  SysUtils,
  Classes,
  Math;
 
{$R *.res}
 
Function sq_polygon(n,b:Real):Real; stdcall;
begin
Result:=(1/4)*n*b*b*Cotan(Pi/n);
end;
Function perimeter_polygon(n,b:Real):Real; stdcall;
begin
Result:=n*b;
end;
 
Exports
 sq_polygon index 1, perimeter_polygon index 2;
begin
end.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//App_polygon.pas
unit App_polygon;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    valve: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
   //CONST DLLName='Polygon.dll'; // имя DLL
   CONST DLLName='SimpleDLL.dll'; // имя DLL
  Type
  TAllFunc = Function(n,b:Real):Real; cdecl;//stdcall;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
Var
  n,b:Real;
  Square:TAllFunc;
  Perimeter:TAllFunc;
  flag:Boolean;
  Handle:LongInt;
begin
  flag:=false;
  if( Edit1.Text <> '') then
  b:=StrToFloat(Edit1.Text)
  else
    ShowMessage('Введите параметр b!');
  if( Edit2.Text <> '')  then
    begin
    n:=StrToFloat(Edit2.Text);
    flag:=true;
    end
  else
    ShowMessage('Введите параметр n!');
  if(flag=true) then
  begin
     //Загружаем библиотеку
      Handle:=LoadLibrary(DLLName);
      if(Handle<>0) then
      begin
      @Square := GetProcAddress(Handle,PChar(LongInt(1)));
      @Perimeter := GetProcAddress(Handle,PChar(LongInt(2)));
 
     IF Assigned(Square) then
  Label5.Caption:=FloatToStrF(Square(n,b),ffFixed,10,4)
                   else
                   ShowMessage('Ошибка доступа к библиотеке(Sq) '+DLLName);
    IF Assigned(Perimeter) then
  Label6.Caption:=FloatToStrF(Perimeter(n,b),ffFixed,10,4)
                            else
                           ShowMessage('Ошибка доступа к библиотеке(Per) '+DLLName);
      end //Handle <>0
      else ShowMessage('Ошибка загрузки библиотеки'+DLLName);
   FreeLibrary(handle);
  end;//flag=true
 
end;
 
end.

А если использовать эту, происходит странное. Она полностью пропускает функцию Square, и вызывает функцию Perimeter, причем записывает ф-ю Perimeter в первую переменную, которая хранит ссылку на функцию из dll - библиотеки. Вторая такая переменная содержит результат 0.0.
Как можно проиндексировать функции в dll-ке, написанной на c++?
Или может кто знает другие пути решения?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 01:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru