استثناء البديل عملية غير صالحة محاولة الوصول OleVariant في دلفي - يعمل في C #
سؤال
وأنا أحاول الوصول إلى 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 بشكل أو بآخر، إما مجموعة أو ما شابه ذلك؟