Jump to content

C++: Konvertēt MFC uz C++/CLI ar ārēju OCX


Mezavecis
 Share

Recommended Posts

Tātad ir viens devaiss, kuram nāk līdz device.ocx bibliotēka. Nepieciešamība ir palaist funkcionālu iekš C# koda. Pa taisno pievienojot referenci C# (arī VBA kaut ko līdzīgu ieraudzīju), izsaucot jebkuru metodi atgriež neko neizsakošu kļūdu "Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))". 
 
Devaisam nāk līdz C++ MFC projekts, kurš kustina COM objektu (device.ocx)  un darbojas bez kļūdām. Tad radās doma uzcept C++/CLI projektu, lai varētu izsaukt visas vajadzīgās funkcijas. Diemžēl ar MFC esmu uz jūs un īsti nav skaidrs, kā šo te korekti var palaist C++/CLI projektā, jo pēc noklusējuma tadas CWnd klases nav, bet pievienojot afxwin.h, sāk birt kļūdas kaut par dublikāta funkcijām. 
 

class BigDevice: public CWnd
{
protected:
	DECLARE_DYNCREATE(BigDevice)
public:
	CLSID const& GetClsid()
	{
		static CLSID const clsid
			= { 0x647E6510, 0x8880, 0x4980, { 0x00, 0x6, 0x89, 0x83, 0xEE, 0x6D, 0xDE, 0xE5 } };
		return clsid;
	}
	virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle,
						const RECT& rect, CWnd* pParentWnd, UINT nID, 
						CCreateContext* pContext = NULL)
	{ 
		return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); 
	}

    BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, 
				UINT nID, CFile* pPersist = NULL, BOOL bStorage = FALSE,
				BSTR bstrLicKey = NULL)
	{ 
		return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
		pPersist, bStorage, bstrLicKey); 
	}
public:


	void ShowInfo()
	{
		InvokeHelper(DISPID_ABOUTBOX, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
	}
	long Connect()
	{
		long result;
		InvokeHelper(0x1, DISPATCH_METHOD, VT_I4, (void*)&result, NULL);
		return result;
	}
    ...
};

 
Varbūt vēl kādi varianti, kā pa taisno C# pievienot device.ocx? Google īsti nepasaka, kas var būt par iemesliem. 

Link to comment
Share on other sites

Kā tas ir domāts pa taisno?
OCX jābūt reģistrētam. Kas šķiet ir jau izdarīts, ja jau MFC projekts to kustina bez kļūdām.
Un tālāk to ar to var strādāt līdzīgi kā ar Excel ActiveX. Kur nav nekādas starpības vai to dara C# programma vai jebkādā citā programmēšanas valodā veidota programma, vai no GUI vai CLI. Iespējams, ka būs jāizveido Type Library.
 

Link to comment
Share on other sites

Mezavecis

OCX ir reģistrēts un jau izmēģināju tādus scenārijus kā ar Excel. Ilgi bakstoties sapratu, ka bez GUI tā visa būšana nav spējīga kustēties, tāpēc met kļūdas, bet mans kods ir konsole atšķirībā no sempla. Arī iebāžot windows formā, jau parādās citas kļūdas, ka kaut kāds tips nav reģistrēts, lai gan viss ir sainstalēts tā, kā to aprakstīts ražotāja tūlī. 

 

Pašlaik aizsūtīju devaisa ražotājam ziņu, lai atsūta kaut kādus piemērus vai citu variantu. OCX rūpnieciskam verķim nav normāls risinājums.

 

Te vairāk jautājums bija par to, kā MFC var korekti pārveidot uz CLI, lai nebūtu miljons kļūdu dēļ MFC, it sevišķi, kad runa par COM komponentiem.  Līdz šim nevienu sakarīgu materiālu neesmu atradis.

Link to comment
Share on other sites

Tev vajadzētu pašam izveidot minimālu C++/CLI (vai GUI) programmu, kas korekti izveido OLE objektu un izsauc kaut vienu funkciju. Un ja tas ir iespējams, tad skatīties kā to veidot tālāk. Uz buj duj izdīrājot kaut ko no MFC projekta nekas nesanāks, tur tomēr ir jāsaprot kas un kā notiek.

Vispār pēc ieliktā koda gabala izskatās, ka pats komponents ir GUI komponents.

Tādā gadījumā CLI programmā var izveidot neredzamu (debug versijā redzamu) logu ar vajadzīgo komponentu. Un tad skatīties tālāk.

Labots - HIGH-Zen
Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...