Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Библиотеки на С++ для Дельфи. [D6, XP]


Страницы:   1 2 3

Drowsy ©   (2009-02-05 01:25:00) 

Можно на С++ создать библиотеку, которую можно будет в Дельфи использовать?


Drowsy   (2009-02-06 12:18:00) [21]

program PASPro;

uses
 Forms,
 UPAS in 'UPAS.pas' {Form1};

{$R *.res}

begin // здесь останавливаю, жму F7 и вываливается: Project  raised too many ...... и окно CPU
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.


Сергей М.   (2009-02-06 12:13:00) [22]

А что показывает отладчик при пошаговой трассировке ?


Drowsy   (2009-02-06 12:10:00) [23]

Выбрасывает ошибку:
Project  raised too many consecutive exceptions: application defined exception (code xxxx) at xxxx. Process stopped.


Drowsy   (2009-02-06 12:09:00) [24]

procedure Mess(); stdcall;
var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure Mess(); stdcall; external 'MYDLL.dll' name 'Mess';


Drowsy   (2009-02-06 12:07:00) [25]

Я же указал:
procedure Mess(); stdcall;


Anatoly Podgoretsky   (2009-02-06 12:07:00) [26]

> Drowsy  (06.02.2009 11:26:18)  [18]

Так и необязательно, но тогда будет использоваться позднее связывание.


tesseract   (2009-02-06 12:05:00) [27]


> procedure Mess(); external 'MYDLL.dll' name 'Mess';


procedure Mess(); stdcall; external 'MYDLL.dll' name 'Mess';


Сергей М.   (2009-02-06 12:03:00) [28]

А где соглашения о вызове ?


Drowsy   (2009-02-06 11:55:00) [29]

Я убрал вообще параметр:

в С++ :

void Mess(void)
{
Application->MessageBox("Messa","From DLL",IDOK);
}

в Дельфи
procedure Mess(); external 'MYDLL.dll' name 'Mess';

Выбрасывает ошибку:
Project  raised too many consecutive exceptions: application defined exception (code xxxx) at xxxx. Process stopped.


Сергей М.   (2009-02-06 11:49:00) [30]

В данном контексте не надо.


Drowsy   (2009-02-06 11:42:00) [31]

Хитро.
А вновь созданную библиотеку в системе не надо регистрировать как-нибудь
(в регистрах или ещё как?)


Сергей М.   (2009-02-06 11:37:00) [32]


> Drowsy


Название DLL говорит само за себя - это динамическисвязываемая библиотека, т.е. вся фактическая работа с ней осуществляется в ран-тайм.


Сергей М.   (2009-02-06 11:35:00) [33]

Как это не нужен ?
Нужен !
Но не для проверки наличия, а для размещения соотв.информации в таблице импорта будущего исполняемого модуля.
Эта таблица импорта выходит на сцену в ран-тайм.


Drowsy   (2009-02-06 11:26:00) [34]

Логично, но..
А зачем тогда указывать название библиотеки, если компилтору он не нужен?


Сергей М.   (2009-02-06 11:15:00) [35]


> думалось, что компилятор хотя бы проверяет наличие библиотеки


С какого перепугу-то ?
Delphi не вправе ведь запретить тебе компилить проект для исполнения на другой машине, где тобой предполагвется наличие "любой фигни")


Drowsy   (2009-02-06 11:02:00) [36]

Может быть и несовпадение.
Только, обнаружил что-то совсем странное.
Мне думалось, что компилятор хотя бы проверяет наличие библиотеки,
(не говоря уже о функциях, типах.. в библиотеке), но
он проглатывает спокойно

procedure Mess(var S : string); external 'Любая фигня' name 'Mess';


Anatoly Podgoretsky   (2009-02-06 10:19:00) [37]

> Drowsy  (06.02.2009 9:14:12)  [12]

У тебя несовпадение типов в Mess


tesseract   (2009-02-06 10:12:00) [38]

Удалено модератором


tesseract   (2009-02-06 10:12:00) [39]

про stdcall почему всегда все забывают ?


Drowsy   (2009-02-06 09:14:00) [40]

проблема:
1. Есть библиотека dll скомпилированная в С++билдере
2. Если эту библиотеку использует программа написанная на С++, то всё проходит нормально.
3. А если на Дельфи, то при запуске программы ошибка возникает уже до Application.Initialize;

//---------------------------------------------------------------------------
DLLMAIN.H
//---------------------------------------------------------------------------

#if defined(_DLLMAINCPP)
# define DLL_SPEC __declspec(dllexport)
#else
# if defined(_APPMAINCPP)
# define DLL_SPEC __declspec(dllimport)
#else
# define DLL_SPEC
# endif
#endif
void DLL_SPEC Mess(char *s);

//---------------------------------------------------------------------------
DLLMAIN.CPP
//--------------------------------------------------------
#define _DLLMAINCPP
// обратите на эту строчку внимание
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "dllmain.h"
#pragma argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
void Mess(char* p)
{
Application->MessageBox(p,"From DLL",IDOK);
}
//------------------------------------------------

//------------------------------------------------
В Дельфи:
//------------------------------------------------

unit UPAS;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

procedure Mess(var S : string); stdcall;
var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure Mess(var S : string); external 'MYDLL.dll' name 'Mess';

procedure TForm1.Button1Click(Sender: TObject);
var S : string;
begin
 S := 'Привет!';
 Mess(S);
end;
end.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо