Форум: "Основная";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.092 c