استثناء البديل عملية غير صالحة محاولة الوصول OleVariant في دلفي - يعمل في C #

StackOverflow https://stackoverflow.com/questions/483859

  •  20-08-2019
  •  | 
  •  

سؤال

وأنا أحاول الوصول إلى OleVariant في الاستدعاء التي تأتي من مكتبة اكتف.

وإليك ما يعرف معالج الحدث كما هو الحال في TLB:

procedure(ASender: TObject; var structQSnap: {??structVTIQSnap}OleVariant) of object;

وفيما يلي تعريف structVTIQSnap في TLB:

structVTIQSnap = packed record
  bstrSymbol: WideString;
  bstrListingExch: WideString;
  bstrLastExch: WideString;
  fLastPrice: Double;
  nLastSize: Integer;
  bstrBbo: WideString;
  bstrBidExch: WideString;
  fBidPrice: Double;
  nBidSize: Integer;
  bstrAskExch: WideString;
  fAskPrice: Double;
  nAskSize: Integer;
  fHighPrice: Double;
  fLowPrice: Double;
  fOpenPrice: Double;
  fClosePrice: Double;
  nCumVolume: Integer;
  bstrTradeCondition: WideString;
  nQuoteCondition: Integer;
  bstrCompanyName: WideString;
  f52WeekHigh: Double;
  f52WeekLow: Double;
  fEps: Double;
  nSharesOutstanding: Integer;
  nSpCode: Integer;
  fBeta: Double;
  bstrExDivDate: WideString;
  nDivFreq: Integer;
  fDivAmt: Double;
  nAvgVolume: Integer;
  bstrCusip: WideString;
  fVwap: Double;
  bstrUpdateTime: WideString;
  bstrExch: WideString;
  nSharesPerContract: Integer;
end;

ويجمع ما يرام، ولكن في كل مرة أحاول الوصول إلى bstrSymbol، أحصل على "غير صالح البديل عملية":

 procedure TForm1.HandleVTIQuoteSnap(ASender: TObject; var structQSnap: OleVariant);
 var
    symbol: WideString;
 begin
    symbol := structQSnap.bstrSymbol; // this line causes the exception
 end;

وكيف يمكنني الوصول إلى structQSnap وخصائصه في دلفي؟

في C #، هذه الوظيفة يعمل بشكل جيد لمعالج الأحداث:

    void vtiQ_OnVTIQSnap(ref vtiLib.structVTIQSnap structQSnap)
    {
        MessageBox.Show("Got qsnap for " + structQuoteSnap.bstrSymbol);            
    }

وأي أفكار؟

هل كانت مفيدة؟

المحلول

وأعتقد أن اكتف معالج الاستيراد دلفي لا يعرف كيفية التعامل مع نوع structVTIQSnap (والتي يبدو أن رقم قياسي) بشكل صحيح ويستخدم فقط OleVariant الافتراضية. هل هناك تعريف نوع اسمه structVTIQSnap أو ما شابه ذلك في ملف ولدت ..._ TLB.pas؟ حاول استخدام أنه بدلا من OleVariant، منها مثلا.

procedure (ASender: TObject; var structQSnap: structVTIQSnap) of object;

وعلى الأرجح أن أعلن كنوع "سجل معبأة".

نصائح أخرى

هل يمكن أن محاولة التلبيس على structQSnap إلى مؤشر إلى هذه البنية. شيء من هذا القبيل

PstructVTIQSnap = ^structVTIQSnap;
structVTIQSnap = packed record
   bstrSymbol: WideString;
   // other stuff...
end;

و

procedure TForm1.HandleVTIQuoteSnap(ASender: TObject;
  var structQSnap: OleVariant);
var
  ps: PstructVTIQSnap;
  symbol: WideString;
begi
  ps := PstructVTIQSnap(structQSnap.VPointer^);
  symbol := ps.bstrSymbol;
  ...
end;

وماذا أنا لا أفهم ذلك هو ما يلي: أنا أعتبر من <م> المرجع في C # رمز أن الهيكل يجب تنظيمها مرتين، مرة من المكتبة إلى استدعاء ثاني إلى مكتبة. وهذا يعني أن العلم varByRef (4000 $) يحتاج إلى أن توضع في بحقل VType، ولكن قيمة ما قدمتموه في تعليقك (3484) إلى حد صغير جدا؟

ونحاول أن ننظر ما يعود في TVarData (structQSnap) .VType؟

قد يكون أنها ستعمل:

 var
   symbol: WideString;
   rec: structVTIQSnap;
 begin
    rec := structVTIQSnap(structQSnap);
    symbol := rec.bstrSymbol; 
 end;

وأنا لست متأكدا لماذا كنت تفكر في "structVTIQSnap" لتكون "OleVariant". يبدو ترجمة غريبة بالنسبة لي. هل يمكن أن تكون أن تم وضعها إلى OleVariant بشكل أو بآخر، إما مجموعة أو ما شابه ذلك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top