Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.035 c
1-1100334175
AlexBragutsa
2004-11-13 11:22
2004.11.28
Для начинающего Делфиста


14-1100111512
zokzok
2004-11-10 21:31
2004.11.28
Абстрактные методы


3-1099159192
SergP
2004-10-30 21:59
2004.11.28
Отображение номера записи в DBCtrlGrid


4-1097683331
Alexis
2004-10-13 20:02
2004.11.28
Хук на WH_GETMESSAGE


14-1100438747
Иной
2004-11-14 16:25
2004.11.28
Сумрачная ветка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский