Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

Blob и Variant   Найти похожие ветки 

 
Sandman25 ©   (2004-11-12 15:52) [0]

Перевожу dll с D4 на D6.
AVariant: Variant;
ABlobField: TBlobField;

AVariant := ABlobField.Value;
и затем передача результата в вызывающее приложение (и в dll, и в вызывабщем приложении стоит ShareMem),
в клиенте AnotherBlobField.Value := AVariant;

Результат - в D6 вместо 35610 байт в AnotherBlobField записывается только 4.
Продебаггил, выяснил, что AVariant формируется правильно, затем при выполнении AnotherBlobField.Value := AVariant получается, что
в TBlobField.SetAsString в параметре уже обрубленная строка, то есть имеем что-то вроде
AnotherBlobField.Value := VarToStr(AVariant);
и на выходе из VarToStr имеем обрубленные данные (пятым байтом в исходных данных часто идет #0).
Вопрос - почему в D4 это работало и как добиться того, чтобы работало и в D6?

Пробовал AnotherBlobField.Value := VarToWideStr(AVariant), не помогает.
Поискал по интернету - советуют воспользоваться VarArray, но этот вариант неприемлем из-за быстродействия.


 
Sandman25 ©   (2004-11-12 16:14) [1]

Виноват, сразу не написал, что
 V := VarArrayCreate([0,15], varVariant);
и соответсвенно вместо AVariant используется V[1]


 
Sandman25 ©   (2004-11-12 16:39) [2]

Корень проблемы найден. В D6 невозможно записать строку в элемент вариантного массива. Вот простейший тестовый проект. Если у кого-то есть какие-нибудь соображения, буду очень признателен. Пока склоняюсь к изменению интерфейса экспортируемой функции.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, DB, DBClient;

type
 TForm1 = class(TForm)
   c1: TClientDataSet;
   c1p: TBlobField;
   c2: TClientDataSet;
   c2p: TBlobField;
   bt1: TButton;
   procedure bt1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.bt1Click(Sender: TObject);
var
 V: Variant;
begin
 V := VarArrayCreate([0,15], varVariant);
 c1.insert;
 c1p.LoadFromFile("c:\temp\1.jpg");
 c1.Post;
 V[0] := c1p.Value;
 c2.Insert;
 c2p.Value := V[0];
 c2.Post;
 c2p.SaveToFile("c:\temp\2.jpg");
end;

end.

object Form1: TForm1
 Left = 192
 Top = 108
 Width = 544
 Height = 375
 Caption = "Form1"
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object bt1: TButton
   Left = 136
   Top = 56
   Width = 75
   Height = 25
   Caption = "bt1"
   TabOrder = 0
   OnClick = bt1Click
 end
 object c1: TClientDataSet
   Active = True
   Aggregates = <>
   Params = <>
   Left = 96
   Top = 136
   Data = {
     390000009619E0BD010000001800000001000000000003000000390001700400
     4B0000000100075355425459504502004900070042696E617279000000}
   object c1p: TBlobField
     FieldName = "p"
   end
 end
 object c2: TClientDataSet
   Active = True
   Aggregates = <>
   Params = <>
   Left = 312
   Top = 144
   Data = {
     390000009619E0BD010000001800000001000000000003000000390001700400
     4B0000000100075355425459504502004900070042696E617279000000}
   object c2p: TBlobField
     FieldName = "p"
   end
 end
end


 
Sandman25 ©   (2004-11-12 16:40) [3]

Все update поставлены (rtl 1-2, update 1-3)


 
Sandman25 ©   (2004-11-12 18:01) [4]

В общем, неправильно работает одна из двух ole-функций: VarCopy или SysAllocMemLen, на которые нет исходников, естественно.
Все понятно, всем спасибо :)


 
Sandman25 ©   (2004-11-15 11:07) [5]

Оказывается, глюк обходится через VarArrayLock. Спасибо коллеге.



Страницы: 1 вся ветка

Текущий архив: 2004.11.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.032 c
1-1100621755
TDBGridEh
2004-11-16 19:15
2004.11.28
TDBGridEh - footer....


1-1100452965
dolphin
2004-11-14 20:22
2004.11.28
список имен файлов и папок


14-1099934556
Drakon
2004-11-08 20:22
2004.11.28
EULA


1-1100180949
Rule
2004-11-11 16:49
2004.11.28
Ссылки классов или переменные классов, как быть ?


3-1099466422
Andreww
2004-11-03 10:20
2004.11.28
как экспортировать таблицу из оракла в dbf?