Страница 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) - передается какая-то ерунда
Киньте код функции 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;
в доке похоже не описано