Страница 2 из 2

Re: Вызов DLL функции из LinkForm

Добавлено: 18 июл 2005, 12:15
Max_Fin
kostya_100 писал(а):Возможно Integer в Delphi это не то же самое, что Integer в Галактике
Integer в Delphi это привычный Вам LongInt

Добавлено: 18 июл 2005, 12:40
Max_Fin
Serges писал(а):Именно! MyFunc(Oem2Ansi(1)) - в DLL передается 1, а если MyFunc(1) - передается какая-то ерунда :shock:
Киньте код функции MyFunc, тогда и видно будет

Добавлено: 18 июл 2005, 13:00
Serges
library DLLForms;

{ }

uses
Forms,
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Dialogs,
DBXpress,
FMTBcd,
StdCtrls,
DB,
DBClient,
SqlExpr,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}
function MakeQuery(par: integer) : integer; stdcall;
var
Form : TForm1;
st: TStrings;
stt: string;
begin

try
st:=TStringList.Create;
st.Clear;
st.LoadFromFile('SQLIN.txt'); // загружается запрос из файла

Form := TForm1.Create(Application);
Form.SQLConnection1.Params.LoadFromFile('params.ini');
Form.SQLQuery1.Active:=false;
Form.SQLQuery1.SQL.Clear;
Form.SQLQuery1.SQL.Add(st.Strings[par]); // указывается номер запроса (номер строки в файле)
st.Clear;

if Pos('SELECT',UPPERCASE(Form.SQLQuery1.SQL.Text))>0 then result:=1
else result:=0;
Form.SQLConnection1.Connected:=true;
if result=1 then
Form.SQLQuery1.Active:=true // если select
else
Form.SQLQuery1.ExecSQL(true); // если не select

if result=1 then
begin
while Form.SQLQuery1.Eof<>true do // формируем строки результата запроса
begin
stt:='';
result:=0;
while result<Form.SQLQuery1.FieldCount do
begin
stt:=stt+Form.SQLQuery1.Fields[result].AsString+'|';
result:=result+1;
end ;
st.Add(stt);
Form.SQLQuery1.Next;
end;
st.SaveToFile('SQLOUT.txt'); // сохраняем в файле
end;

st.Free;
Form.SQLQuery1.Active:=false;
Form.SQLQuery1.Free;
Form.SQLConnection1.Connected:=false;
Form.SQLConnection1.Free;
Form.Free;
result:=1;
except
Form.Free;
result:=0;
ShowMessage('Ошибка выполнения запроса!');
end;

end;

exports
MakeQuery name 'SQLCMD';

begin
end.


Функция предназначена для обращения к базе данных, выполнения запроса (который хранится в текстовом файле) и сохранения результата в текстовый же файл. Параметр функции - номер строки в файле, где лежат запросы. Возвращать она должна код - 0 или 1.
Так вот, ни передать параметр, ни получить код возврата, которые оба имеют тип Integer, не удается. Параметр удалось передать только способом, описанным выше, а вот получить обратно - проблема. Пробовали передавать строковые параметры - таже картина, собственно поэтому запрос к базе берется из файла - передать его как параметр не получилось.


VIP:

Interface Dll_Test 'Tест';

create view as select * from adoc;

var testt : Integer;

HandleEvent
cmInit:
{
testt := SQLCMD(1); // передается фигня, запрос не выполняется, функция возвращает 0
testt := SQLCMD(Oem2Ansi(1)); // передается 1, запрос выполняется, функция возвращает 1
Message(testt,okButton); // в любом случае testt оказывается равным какому-то 6-ти значному числу, причем одному и тому же, вне зависимости от того, успешно выполнилась функция или нет
CloseInterface(cmdefault);
}

end;
end. // Interface

Добавлено: 18 июл 2005, 13:46
Max_Fin
1. в inc-файле должно быть написано так:

Код: Выделить всё

function  SQLCMD(LongInt): LongInt; external 'youdll.dll';
2. заголовок твоей функции без stdcall, в этом самая главная ошибка, в стек не правильно ложаться параметры.

Код: Выделить всё

function MakeQuery(par: integer) : integer;

Добавлено: 19 июл 2005, 06:17
Serges
в стек не правильно ложаться параметры
Такое подозрение у меня и возникло.
Действительно, без stdcall проблемы снимаются.

Добавлено: 19 июл 2005, 13:03
san
в галактике есть две ф-ции
OEM2ANSI(string):string;
ANSI2OEM(string):string;
в доке похоже не описано