Проблема при передаче параметров библиотеке.

paulic
Дата: 03.05.2011 10:59:20
Всем добрый день!
помогите пожалуйста.
Ситуация следующая: я вызываю библиотеку, в которую передаю 2 параметра:
- ADOQuery1 - Pointer
и
- строку - (строку пробовал передавать разными способами и string и widestring и указателем)
адо передается нормально, а вот строка передает кракозябры!
решил попробовать поменять местами параметры в вызове процедуры, после этого строка передается, а адо нет! Ну т.е. передается,но непонятно что.
(пробовал и на d7 и 2010)

кто-нибудь подскажет в чем дело?
спасибо!
ДжекНепотрошитель
Дата: 03.05.2011 11:11:55
Явные симптомы того, что у тебя разные соглашения о вызове в программе и в библиотеке. Ну а про sharemem будешь спрашивать позже, когда Access Violation начнет вылезать :)
paulic
Дата: 03.05.2011 12:14:47
ДжекНепотрошитель
Явные симптомы того, что у тебя разные соглашения о вызове в программе и в библиотеке. Ну а про sharemem будешь спрашивать позже, когда Access Violation начнет вылезать :)


Вызов и описание одинаковые - копи паст!
sharemem стоит на почетном первом месте.
Ega
Дата: 03.05.2011 12:16:25
paulic
Вызов и описание одинаковые - копи паст!
sharemem стоит на почетном первом месте.


Т.е. и там и там stdcall стоит?
Anatoly Podgoretsky
Дата: 03.05.2011 12:17:27
Это всего лишь слова.
paulic
Дата: 03.05.2011 17:02:55
вот конкретный код:

объявление:

procedure ReportAuto(Ado: pointer; FileNameDll: pointer);
stdcall; external 'ReportIntegrated.DLL';

вызов:
...
var s:WideString;
    int:integer;
begin
  s := FileName; 
  ADOQuery1.Active := false;
  ADOQuery1.SQL.Text := 'select * from box';
  ADOQuery1.Active := True;
  ReportAuto(@ADOQuery1, @s);
end;


библиотека:

library ReportIntegrated;

uses
  ShareMem,
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Dialogs,
  StdCtrls,
  XLSReadWriteII4,
  ExtCtrls,
  JPEG,
  ADODB;

....

procedure ReportAuto(Ado: pointer; FileNameDll: pointer);
var i, k, j, col, row:integer;
    pos_search : mas;
    s : string;
    OpenDialog1: TOpenDialog;
begin

ADOQuery1 := TADOQuery.Create(nil);
ADOQuery1 := TADOQuery(Ado^);
ShowMessage(IntToStr(ADOQuery1.RecordCount));

s:= string(FileNameDll^);
ShowMessage(s);

здесь первое сообщение выдает правильное количество строк, а второе возвращает вот такую ...
Картинка с другого сайта.
paulic
Дата: 03.05.2011 17:04:15
а должно было 'd:\tamplete.xls'
Barmaley57
Дата: 03.05.2011 17:09:59
А где stdcall в библиотеке?
Barmaley57
Дата: 03.05.2011 17:11:45
paulic
Вот это тоже интересно:
ADOQuery1 := TADOQuery.Create(nil);
ADOQuery1 := TADOQuery(Ado^);
Зачем создавать объект, если потом его подменяешь?
paulic
Дата: 03.05.2011 17:15:42
Barmaley57
А где stdcall в библиотеке?


а где нужно stdcall вставить?