Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / DLL from Delphi to Builder / 13 сообщений из 13, страница 1 из 1
27.10.2003, 18:27
    #32306650
anton smirnoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL from Delphi to Builder
Создаю DLL в Делфи
library Project1;
uses
SysUtils,
Classes;
function sum(var x,y:integer):integer;export;stdcall;
begin
result := x + y;
end;
exports
sum;
end


Загружаю её в Билдере

int (__stdcall * func)(int,int);
func = (int ( __stdcall *) (int,int))GetProcAddress(dll_handle, "sum");


всё вроде хорошо, func!=NULL,
но вот вызов функции (ex. func(100,1)) выдаёт аксесс виолейшион
????
...
Рейтинг: 0 / 0
27.10.2003, 19:49
    #32306724
ZrenBy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL from Delphi to Builder
>>function sum( var x,y:integer):integer;export;stdcall;
Наверное
function sum(x,y:integer):integer;export;stdcall;
...
Рейтинг: 0 / 0
27.10.2003, 21:04
    #32306782
123456789098
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL from Delphi to Builder
так вот anton smirnoff если ты пишешь в дельфи
function sum( var x,y:integer):integer;export;stdcall;
то почему в билдере так:

int (__stdcall * func)(int,int);

а не скажем так:
int (__stdcall * func)(int&,int&); ? (хотя может я не прав и надо писать скажем так :
int (__stdcall * func)(int*,int*); с этим моментом я не уверен на 100%)
...
Рейтинг: 0 / 0
28.10.2003, 10:39
    #32307063
anton smirnoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL from Delphi to Builder
да, на счёт var я может и погорячился (ну не писал я раньше на Делфи)
но вот попробовал без var , такая же лабуда
...
Рейтинг: 0 / 0
28.10.2003, 10:50
    #32307079
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL from Delphi to Builder
У тебя написано var x,y:integer,
а ты туда передаешь константы. Потому и возникает Access violation.
...
Рейтинг: 0 / 0
28.10.2003, 10:53
    #32307085
anton smirnoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL from Delphi to Builder
см. выше, я var убрал, всё равно тоже самое, может в первый раз
вызовется, вернёт какую-то глупость, а на 2-ой, 3-ий, ..., раз опять
аксесс виолейшион
...
Рейтинг: 0 / 0
28.10.2003, 11:00
    #32307105
ZrenBy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL from Delphi to Builder
Все работает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
typedef int (__stdcall * lpfunc)(int,int);
. . .
void __fastcall TForm1::Button1Click(TObject *Sender){
  AnsiString dllSource = ExtractFilePath(Application->ExeName)+ "dll.dll" ;

  if( HMODULE masterDll = LoadLibrary(dllSource.c_str()) ){
    if( lpfunc MyFunc = (lpfunc)GetProcAddress(masterDll, "sum" ) ){
      long lResult = MyFunc( 101 , 1 );
      Application->MessageBox(IntToStr(lResult).c_str(),"", 0 );
    }
    FreeLibrary(masterDll);
} }
...
Рейтинг: 0 / 0
28.10.2003, 11:10
    #32307120
anton smirnoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL from Delphi to Builder
2ZrenBy
слушай, всё получилось, почему?
...
Рейтинг: 0 / 0
28.10.2003, 11:17
    #32307127
ZrenBy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL from Delphi to Builder
Я думаю, что из-за

typedef int (__stdcall * lpfunc)(int,int);
...
Рейтинг: 0 / 0
28.10.2003, 11:20
    #32307135
anton smirnoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL from Delphi to Builder
пробую то-же, только real VS float (оба 8 байт)
нихрена, может у меня лыжи не катят
...
Рейтинг: 0 / 0
28.10.2003, 11:25
    #32307146
anton smirnoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL from Delphi to Builder
оказалось
real -> double
...
Рейтинг: 0 / 0
28.10.2003, 11:48
    #32307193
anton smirnoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL from Delphi to Builder
на самом деле всё не тревиально, надо изменить у TCustomADODataSet
динамические свойства, к которым в Buildere не подступишься. Что-то типа
Код: plaintext
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.
library MyDll;
uses
  SysUtils,
  Classes,
  adodb,
  adoint;
{
 prop_index :=  1  'Update Criteria'
 prop_index :=  2  'Update Resync'
}
function SetDinamicProp(var ds:TCustomADODataSet;prop_index:integer;val:integer):boolean;export;stdcall;
  Result :=True;
begin
if prop_index =  1  then
 begin
  ds.Properties['Update Criteria'].Value := val;
  Result :=True;
 end
else
if prop_index =  2  then
 begin
  ds.Properties['Update Resync'].Value := val;
  Result :=True;
 end
else
  Result :=False;


end;
exports
SetDinamicProp;
end.
...
Рейтинг: 0 / 0
28.10.2003, 12:50
    #32307293
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL from Delphi to Builder
автор писал:надо изменить у TCustomADODataSet
динамические свойства, к которым в Buildere не подступишься
Не понял. Это какие свойства можно изменить в Delphi, а в Builder-e нельзя?
Они же как близнецы похожи, только язык разный.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / DLL from Delphi to Builder / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]