![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Библиотеки на С++ для Дельфи. [D6, XP]
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.