Poslední příspěvky

Stran: [1] 2 3 ... 10
1
Obecné / Re:COM klient ve vlákně
« Poslední příspěvek od Delfin kdy 20-10-2017, 23:21:06 »
Zeptám se možná hloupě, ale zaregistroval a spustil jsi nejdřív server? Pokud ne, tak je nenalezené ProgID celkem jasné.

Soucasti toho projektu jsou i demo servery (volaji metodu RegisterOPCServer). Nic ale do registru nezapisuji. Za me vim jak pouzit Windowsi RegSvr; tady mi ale nejak nedochazi co mam vlastne registrovat (protoze se registruji DLL zatimco ty projekty serveru tvori EXE). Tajne jsem doufal ze je proste zbuilduju, spustim a klient si zacne vesele povidat (prDemo<n> chapu jako servery a ClientDemo<n> jako klienty).

Co se týče toho, že už asi vím, kde jsem udělal chybu: čtení z COM objektu dělám přes metodu Synchronize() vlákna, a tudíž de facto v hlavním vláknu - no a tam CoInitialize nemám. V COM/DCOM architektuře se moc nevyznám, ale mám tušení, že to bude zřejmě ten problém.

Hlavni vlakno ma COM implicitne inicializovany (diky metode Application.Initialize).
2
Obecné / Re:COM klient ve vlákně
« Poslední příspěvek od Morrison kdy 20-10-2017, 23:01:16 »
Delfin: jsem čuně a postnout sem můj kód je jako pozvat domů návštěvu, když je všude půl cenťáku prachu a na podlaze naděláno od psa :D Je to samozřejmě moje ostuda, že nepíšu kód rovnou načisto. Budu se muset polepšit, protože jinak chápu, že bez kódu se težko radí.
Zeptám se možná hloupě, ale zaregistroval a spustil jsi nejdřív server? Pokud ne, tak je nenalezené ProgID celkem jasné. Popravdě já jsem toho klienta ve výchozí podobě taky úplně nerozchodil. Server, na který se připojuji je asi blbě nainstalovaný, protože nefunguje OPCEnum a k registrům Windows nemám vzdálená práva. Rozjel jsem to, až když jsem klienta upravil tak, aby umožňoval ruční zadání Clsid serveru. Jinak ten PrOPC Toolkit je celkem propracovaná věcička, obzvlášť s ohledem na to, že je to pod MIT licencí.
Co se týče toho, že už asi vím, kde jsem udělal chybu: čtení z COM objektu dělám přes metodu Synchronize() vlákna, a tudíž de facto v hlavním vláknu - no a tam CoInitialize nemám. V COM/DCOM architektuře se moc nevyznám, ale mám tušení, že to bude zřejmě ten problém.
3
Obecné / Re:Text vyplněný vzorkem
« Poslední příspěvek od Delfin kdy 20-10-2017, 22:17:18 »
Jeste obrazek :)

4
Obecné / Re:COM klient ve vlákně
« Poslední příspěvek od Delfin kdy 20-10-2017, 21:46:20 »
Tak už mi to asi docvaklo, ačkoliv teď nemám možnost to otestovat.
Přístup ke COM objektu ve vlákně, konkrétně čtení dat, mám totiž v Synchronize (protože přečtené hodnoty rovnou předávám hlavnímu threadu ke zobrazení). A to je, jak jsem si teď téměř jistej, kardinální blbost.

Tomu bohuzel nerozumim. Me se nepodarilo ani spustit server (s admin pravy pro potrebny zapis do registru). Projekt jsem vzdal pote co klient koncil chybou o neznamem ProgId. Proto jsem ostatne chtel kod nebo pouzite projekt(y) (idealne minimalni, kompilovatelne). Studovat bych ten projekt zacal az po nasimulovani popsane chyby ;) P.S. mam jen Unicode Delphi.
5
Obecné / Re:COM klient ve vlákně
« Poslední příspěvek od Morrison kdy 20-10-2017, 20:30:17 »
Tak už mi to asi docvaklo, ačkoliv teď nemám možnost to otestovat.
Přístup ke COM objektu ve vlákně, konkrétně čtení dat, mám totiž v Synchronize (protože přečtené hodnoty rovnou předávám hlavnímu threadu ke zobrazení). A to je, jak jsem si teď téměř jistej, kardinální blbost.
6
Obecné / Re:Text vyplněný vzorkem
« Poslední příspěvek od Delfin kdy 20-10-2017, 20:07:39 »
AggPas by to mohl umět: http://www.crossgl.com/aggpas/aggpas-demo.htm

Umi nektery port Unicode? Pokud vim, AggPasMod byl ANSI (a to byla "nejnovejsi" varianta portu). Jinak GDI+ tohle umi s par radky kodu:

Kód: Delphi [Vybrat]
  1. uses
  2.   Winapi.GDIPAPI, Winapi.GDIPOBJ;
  3.  
  4. procedure TForm1.FormPaint(Sender: TObject);
  5. var
  6.   S: WideString;
  7.   Font: TGPFont;
  8.   Brush: TGPBrush;
  9.   Graphics: TGPGraphics;
  10. begin
  11.   Graphics := TGPGraphics.Create(Canvas.Handle);
  12.   try
  13.     Brush := TGPHatchBrush.Create(HatchStyleDiagonalCross, aclSilver, aclBlack);
  14.     try
  15.       Font := TGPFont.Create('Arial Narrow', 120);
  16.       try
  17.         S := '葉覧都髄土背条明説果差感';
  18.         Graphics.DrawString(S, Length(S), Font, MakePoint(0.0, 0.0), Brush);
  19.       finally
  20.         Font.Free;
  21.       end;
  22.     finally
  23.       Brush.Free;
  24.     end;
  25.   finally
  26.     Graphics.Free;
  27.   end;
  28. end;
7
Obecné / Re:Text vyplněný vzorkem
« Poslední příspěvek od oxo kdy 20-10-2017, 18:08:42 »
8
Obecné / Re:COM klient ve vlákně
« Poslední příspěvek od Morrison kdy 20-10-2017, 17:53:00 »
Delfin: jednoduše popsáno, snažím se rozjet TOpcSimpleClient ve vlákně. Zkusil jsem i TVSC (VerySimpleClient z unity prOpcVSC.pas) a opět končím na "EIntfCastError: Interface not supported". Příklady fungují bez problému, protože tam je vše vždy v hlavním vlákně aplikace. Kdyby connectnutí k serveru netrvalo občas tak hrozně dlouho, klidně bych to taky nechal ve hlavním vlákně, ale občas to blokuje i desítky sekund.

Slappy: CoInitializeEx funguje z mého omezeného pohledu stejně jako obyč. CoInitialize. Dle MSDN zhruba chápu, že s COINIT_MULTITHREADED sdílejí všechna vlákna stejný apartment, ale to bohužel neřeší výše uvedený problém s nepodporovaným rozhraním.

trochu OT: Stejně je naprosto úžasný, jak tady na delphi.cz člověk prakticky vždy najde odezvu ostatních a vždy cítí snahu ostatních mu pomoci.
9
Obecné / Re:COM klient ve vlákně
« Poslední příspěvek od Slappy kdy 20-10-2017, 17:29:36 »
Myslím, že pro každé vlákno a COM musíš volat Coinitialize

Presnejsie
Kód: [Vybrat]
CoInitializeEx(nil, COINIT_MULTITHREADED);
10
Obecné / Re:COM klient ve vlákně
« Poslední příspěvek od Delfin kdy 20-10-2017, 17:15:18 »
O jaky kod se jedna? Nektery z prikladu?
Stran: [1] 2 3 ... 10