COM Assertion hiba

COM Assertion hiba
2007-05-04T13:15:52+02:00
2011-02-14T19:16:08+01:00
2022-11-20T20:05:40+01:00
ZsZs
Sziasztok!

Volt egy COM-os típuskonverziós problémám, az hála ChainsaW_GS-nek az megoldódott, de egy új (más) probléma adódott:

Az előzmények a COM típuskonverzió hiba linken megnézhető.

Az alábbi módon csináltam meg amit ChainsaW_GS javasolt:

CComPtr<IDimension> swDim; CComPtr<IDispatch> swDisp;

és a kód:

hres = swModel->Parameter(_bstr_t(par1), &swDisp); if (hres == S_OK) { [b]hres = swDisp->QueryInterface(IID_IDimension,(void**) &swDim);[/b] if (hres == S_OK) { cout << "Parameter 1 name: " << par1 << " "; unsigned short int* x = 0; hres = swDim->IGetSystemValue3(swSetValue_InThisConfiguration, 0, &x, &retval); if (hres == S_OK) cout << "value = " << retval << endl; BSTR y = 0; hres = swDim->ISetSystemValue3(par1_new, swSetValue_InThisConfiguration, 0, &y, &retval2); if (hres == S_OK) cout << "- modified! (" << par1_new << ")" << endl; else cout << "- error: " << retval2 << endl; } } swDisp = NULL; swDim = NULL;

A feladat az lenne, hogy létesítsek kapcsolatot COM-on keresztül egy CAD-es alkalmazással, olvassak ki a rajz 3db paraméterét, módosítsam meg, és a CAD es progi mutassa meg a megváltozott rajzot.

A fenti módon a (copy+pasteel masolt kóddal) a
hres = swModel->Parameter(_bstr_t([b]par1[/b]), &swDisp);
sor paraméterét mindig aktualizálva (par 2 és par3-ra), a 3db paraméterből kettőt minden további nélkül (tökéletesen) kezelek.
A harmadik paraméternél a
hres = swDisp->QueryInterface(IID_IDimension,(void**) &swDim);
sorban viszont dob egy assertiont!

Miért???

A szövege:

Debug Assertion Failed!

(a forráskód és annak a sora)

Expression p:=0

(egyéb lényegtelen mese)


Ráadásul a swDisp és a swDim váltzók értéke NULL! (debug alatt is ellenőriztem) és épp ezt reklamálná az assertion...

Van valakinek tippje miért? mit szúrtam el?

Köszönettel, üdv.:
ZsZs.
Mutasd a teljes hozzászólást!
hres = swModel->Parameter(_bstr_t(par1), &swDisp);

Ha a hívás után a hres és a swDisp is nulla, akkor valszeg a par1 szöveghez nem talált létező objektumot.
Mutasd a teljes hozzászólást!

  • simán igy próbáld, hagyd ki a CComPTR-t.

    IDimension* swDim = NULL;
    IDispatch* swDisp = NULL;

    mik a hres értékek?
    Mutasd a teljes hozzászólást!
  • hres = swModel->Parameter(_bstr_t(par1), &swDisp);

    Ha a hívás után a hres és a swDisp is nulla, akkor valszeg a par1 szöveghez nem talált létező objektumot.
    Mutasd a teljes hozzászólást!
  • A Solidworks (a CAD-es alkalmazás) hardwerkulcsos és csak odabent tudom elérni, viszont a hiányában még fordítani sem tudok, úgyhogy érdemben csak hétfőn tudok pontosan válaszolni.

    DE...
    ...egyrészt a 3db paraméterből amit olvasok és módosítok 2 tökéletesen működött, az assertion a harmadiknál paraméternél (par3) jelentkezett. (ugyanazt a fenti kódrészletet használva csak módosítva), és a swModel->Parameter() függyvény hres értéke akkor is S_OK (=0) volt, és a SwDim, és swDisp szintén NULL.
    A megnyitott szerkezeti rajzban pedig szerepel a 'D3@Vázlat1' amit én 'par3' ként nevezek a programban.

    RESULT hres; if(SUCCEEDED(hres = CoInitialize(NULL))) { CComPtr<ISldWorks> swApp; CComPtr<IModelDoc2> swModel; //amit javasoltál még csak beírtam a forrásba, de lefordítani nem tudom a Solidworks nélkül: IDimension* swDim = NULL; IDispatch* swDisp = NULL; //CComPtr<IDimension> swDim; //CComPtr<IDispatch> swDisp; if(SUCCEEDED(hres = swApp.CoCreateInstance(__uuidof(SldWorks), NULL, CLSCTX_LOCAL_SERVER))) //Create an instance of SolidWorks { long Er, Wa, St; double retval; long retval2; //a CAD-es dokumentum: char* fn = "C:\\ZsZs\\VC\\Visual Studio 6\\CeraTest\\Docs\\deszka.SLDPRT"; //módosítás után új néven lesz elmentve: char* fn_new = "C:\\ZsZs\\VC\\Visual Studio 6\\CeraTest\\Docs\\deszka_new.SLDPRT"; //a CAD-es dokumentum paraméterei (egy deszka hossza, szélessége és magassága): char* par1 = "D1@Vázlat1"; char* par2 = "D2@Vázlat1"; char* par3 = "D3@Vázlat1"; //új értékek (m-ben) amire módosítva lesz: double par1_new = 0.4; double par2_new = 0.1; double par3_new = 0.03; hres = swApp->OpenDoc6(_bstr_t(fn), swDocPART, swOpenDocOptions_Silent, _bstr_t(""), &Er, &Wa, &swModel); if (hres == S_OK) { cout << "Opened: " << fn << " document." << endl; //Az 1. paraméter kezelése: hres = swModel->Parameter(_bstr_t(par1), &swDisp); if (hres == S_OK) { hres = swDisp->QueryInterface(IID_IDimension,(void**) &swDim); if (hres == S_OK) { cout << "Parameter 1 name: " << par1 << " "; //A paraméter olvasása: unsigned short int* x = 0; hres = swDim->IGetSystemValue3(swSetValue_InThisConfiguration, 0, &x, &retval); if (hres == S_OK) cout << "value = " << retval << endl; //és a módosított érték viszaírása a paraméterbe: BSTR y = 0; hres = swDim->ISetSystemValue3(par1_new, swSetValue_InThisConfiguration, 0, &y, &retval2); if (hres == S_OK) cout << "- modified! (" << par1_new << ")" << endl; else cout << "- error: " << retval2 << endl; } } swDisp = NULL; swDim = NULL; //eddig a pontig tart az 1 paraméter kezelése. //A 2. és a 3. egy ilyen - de a paraméternevében módosított - kódrészlet végzi, ami szerkezetében ugyanaz mint az előző //de mivel kézzel át kell tabulálnom a forrást hogy valahogy tisztességesen ki is nézzen, //azt nem másolom ide... szóval az itenni forrás hiányos!!! // a 3. paraméter után tovább a forrás: //ez a rész rajzolja újra a képernyőt és megjeleníti, az aktualizált paramétereknek megfelelő (átméretezett) rajzot VARIANT_BOOL retval3; hres = swModel->EditRebuild3(&retval3); if (hres == S_OK) { //végül ha sikerült, akkor új néven elmentem: swModel->SaveAsSilent(_bstr_t(fn_new), true, &St); cout << "Saved model." << endl; } swApp->CloseDoc(_bstr_t(fn)); cout << "Closed document." << endl; } //swApp->ExitApp(); swApp = NULL; swModel = NULL; } CoUninitialize(); } }

    A solidworks és a COm kapcsolatáról a neten képtelen voltam egyetlen(!) C++ forrást fellelni. Visual Basicben persze temérdek példa van. A Solidworks API helpjében ugyanez az ábra.
    Egyetlen kis példaprogramom volt/van, amit a rendszerhez adtak, ami megszólította a Solidworks-öt C++ ban, és az (igyaz csak a ISldWrks és az IModelDoc2-ra -amik a Solidworks saját sztályai amin keresztül őt elérem) használta a CComPtr-t, s úgy gondoltam, hogy ez kell neki...

    Visszatérve az utolsó mondatodhoz:
    "Ha a hívás után a hres és a swDisp is nulla, akkor valszeg a par1 szöveghez nem talált létező objektumot."

    (Nem par1, az első és második paraméterrre már akkorra lefutott, itt a par3-ról van már szó) de ez nekem is eszembe jutott (azzal együtt hogy elírtam valamit...) de a par3 paraéter létezik a rajzon és ha az 1. és a 2. is megvan, akkor a 3.nak is elérhetőnek kell(ene) lennie...

    Nagyon köszönöm a segítségedet!
    Üdv.:
    ZsZs.
    Mutasd a teljes hozzászólást!
  • Visszatérve az utolsó mondatodhoz:
    "Ha a hívás után a hres és a swDisp is nulla, akkor valszeg a par1 szöveghez nem talált létező objektumot."

    (Nem par1, az első és második paraméterrre már akkorra lefutott, itt a par3-ról van már szó) de ez nekem is eszembe jutott (azzal együtt hogy elírtam valamit...) de a par3 paraéter létezik a rajzon és ha az 1. és a 2. is megvan, akkor a 3.nak is elérhetőnek kell(ene) lennie...


    Én azért a biztonság kedvéért a debug-olás során beletennék egy vizsgálatot (Pl.:
    if (swDisp == NULL) {// Hibakezelés}
    ), hogy tényleg megkapod-e az IDispatch interface-t a par3 elkérése után. Mert az egy dolog, hogy minek kellene lennie a dokumentumban, az meg egy másik, hogy mi van. Mivel, ha jól értem nem a QueryInterface hívásban váltódik ki az ASSERTION, hanem a híváskor. Egyébként a CComPtr-nek biztosítania kell, hogy NULL legyen az interface poiner értéke.

    TaDe
    Mutasd a teljes hozzászólást!
  • Igen, ez volt a probléma...
    A harmadik CAD-es változónak teljesen más neve volt: nem D3@Vázlat1, hanem D1@Kihúzás1.


    Nagyon köszönöm a segítségeteket!
    Mutasd a teljes hozzászólást!
  • Habár látom ez már régi fórum de remélem azért még valaki csak válaszol a kérdésemre. Szeretmém megtanulni a solidworks- apiját használni és ehhez kellene nekem egy kis segítség. Elősször is hol kezdjem?:) Létezik hozzá magyar api dokumentáció?
    Mutasd a teljes hozzászólást!
  • A Solidworks-nek van API help-je, vannak példaprogramok is. Zömében VisualBasic, de van C++ is.
    Magyar az nincs...
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd