Pak ale bude pevně daný návratový typ a kompilátor bude hlídat jestli je tento privátní typ viditelný i v aktuálním místě čemuž se snažím vyhnout. Další věc je že jednou může funkce vracet typ data, jindy data1 atd.
Příspěvky odeslané z IP adresy 90.182.189.–
To jo, ale musíš mít předem daný typ (nebo možná používat Variant), ten ukazatel dává mnohem větší volnost, takže funkce může vracet různá data na základě nějaké podmínky ve funkci. Pak je problém s předáváním typů, kdy se každý pomocný typ musí nastavit jako Public, pokud ho chci dostat mimo modul nebo třídu, takže se rychle vytvoří ohromné množství typů, které nemají skoro žádné globální využití, proto taky radši používam ukazatele k jejich skrytí a tam kde typ potřebuju si ho dam jen jako Private.
Třeba pokud je vstupní parametr ukazatel VarPtrArray(pole()) což je ukazatel na typ SAFEARRAY_VECTOR přes který VBA ukládá pole, tak to co píšu jde prohozením ukazatele na data pvData. Po tom prohození ze ve volané funkci zruší pole vstupní, ale zachová se ve funkci vytvořené i po jejím opuštění. Tak jestli nejde nějak podobně "oklamat" VBA i u běžných proměnných.
Ahoj, potřeboval bych, aby měla funkce parametr, který bude ukazatel. Ve funkci se do nějakého datového typu zapíše co má a já chci, aby se šlo přes tento ukazatel na data dostat. Problém je, že samotná proměnná je deklarovaná ve funkci, takže jakmile kód funkci opustí, tak všechny privátní proměnné zruší. Existuje nějaký trik jak se tomu zrušení vyhnout, ale zároveň mít možnost proměnnou zrušit mimo proceduru, kde vznikla?
public sub XXX()
dim tData as data
fceA VarPtr(tData)
end sub
private function fceA (ptr as long)
dim tDataFce as data
...
...
...
'a teď bych potřeboval, aby ptr ukazoval na tDataFce a pokud VBA něco musí zrušit, 'tak aby zrušil tData
end function
Dobrý den,
Jde mě o toto. Mám polygonu, jehož body mají souřadnice uložené jako double a chci testovat úsečky, jestli skrz něj prochází nebo ne. Je možné, že v rámci nepřesností může existovat úsečka, která se s polygonem kříží poblíž nějakého vrcholu tak, že průsečík nespočte? Průsečík by tedy ležel na vektorech (přímkách) obou blízkých stran polygonu, ale test jestli je na úsečkách by ho vyhodil. Lze to nějak šikovně ošetřit?
Ahoj,
Jde mě spíš o popis toho co funkce, která převádí sekvenci znaků na nějaký číselný datový typ dělá. Nebo jak by jste to napsali, kdyby tyto funkce nebyly.
Min. částečně má pravdu, že každému lze odepsat, že to někde už je... Podle mě spíš pokud někoho štve dotaz, tak prostě neodpoví a je klid ne? Bez angličtiny se obejde, ale umět jí rozhodně není na škodu.
Nevíte jestli je něco takového ve VBA možné? Podle mě, se po spuštění kód zkompiluje a uloží se jako dll a tedy ačkoliv lze zapisovat do textu kódu v kompilátoru, tak ten už nemá na probíhající kód, který je v dll vliv a změna se projeví až po další kompilaci (spuštění)...
Dík všem za pomoc, podle toho už to nějak spácham.
Ještě jedna věc, právě když jsem Googloval, tak jsem našel, že jako admin lze vlastnictví přebrat. Proto jsem řešil ty admin práva.
#2 CZIvo
Chtěl bych tedy udělat to, co děla ten Unlocker - zavřít soubor s tím, že následně může aplikace, která ho vlastnila, spadnout... a následně tu aplikaci třeba znovu spustit. Jeden blbej program si nechává vlastnictví, i když k tomu nemá důvod. Nebo alespoň někdy se stává, že drží vlastnictví i po té, co je soubor v aplikaci zavřen (pomůže až ukončení aplikace). Když tedy následně spustím můj program, který dále pracuje s tímto souborem, tak je problém.
Ahoj,
chtěl bych se zeptat jestli je nějak možné z běžného uživatelského účtu zavřít soubor, který je vlastněný jiný procesem (aplikací), kterou spustil stejný uživatel.
A ještě jedna věc mě vrtá hlavou, když třeba mažu soubory v Total Commanderu, tak někdy píše, že to nejde a jestli to chci zkusit jako administrátor a pak to jde. Ale co jsem zkoušel...
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
BOOL b = AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsGroup);
if (b)
{
if (!CheckTokenMembership(NULL, AdministratorsGroup, &b))
b = FALSE;
FreeSid(AdministratorsGroup);
}
Podle toho admin práva nemam.
Jak jsem psal, hodí to jen že nastala kritická chyba, ale udělá to log.
Sice to nesouvisí, ale
If Mid$(CStr(1 / 2), 2, 1) = "," Then
tento kód občas hodí chybu overload, ale většinou proběhne v pohodě, čím to?
Hlavně proto, že když napíšu nějaké základní funkce, které nadále používám skoro ve všem co dělám, tak je mohu použít jak ve VBA tak v C, místo toho abych se pak se vším do C přepisoval a psal tedy vše 2x. O dalších výhodách jsem psal už výše.
Ano s řetězci až tak zásadní problém s výkonem není, ten je spíš až při práci s geometrií, jen jsem chtěl začít s něčím snadným.
#13 BDS
Ale já potřebuju ten BSTR dostat do VBA, ve kterém je to jediný typ pro řetězce. Problém není s operacemi s řetězcem. Třeba nevim proč, nebo jaký je rozdíl mezi řetězcem vytvořeným přes SysAllocString nebo pokud ho vytvořím binárně... následně SysFreeString funguje jen ty vytvořené přes funkci, otázka je tedy jak ten řetězec uvolňuje VBA.
Už to asi mám, ten test musí být jen v jednom vláknu a tam se jedna funkce dostane dřív a jiná/jiné dýl.
Ještě k těm vláknům, stejně nechápu jak přesně může fungovat kontrola třeba toho jestli jsou data zamčená, nebo nějaká kontrola toho jestli je funkce již spuštěna. Tedy v případě, že je ve více vláknech spuštěná funkce ve stejný čas a tedy postupně zároveň probíhají i jednotlivé bloky kódu. Takže vlákna dojdou zároveň třeba k
If spusteno=false then
spusteno=true
...
spusteno=false
end if
Takže všechna spuštění funkce projdou podmínkou?
Nešlo mě už o původní dotaz, spíš jsem jen chtěl vědět jak přesně to probíhá, když vyprší ten timer a volá se jiná procedura. Mam představu, že system rozesílá zprávy a zase procedury zasílají zprávy na zpracovaní, ale já ve VBA se zprávama nic nedělám, nevím tedy jestli na pozadí nejsou nějaké odesílány, ten timer je posílá určitě.
Když jsem to testoval, tak běží funkce A dokud není zavolána funkce B přes timer, zároveň neběží.
Ahoj,
Chtěl bych se zeptat co všechno "přežije" po ukončení procedury do dalšího spuštění? Podle mě data deklarovaná mimo proceduru a pak to co je deklarováno jako static... tyto tedy na začátku resetuju, ale stejně kód hned při druhém spuštění padá, tak bych rád věděl jestli toho ve VBAčku nemůže přežít víc. Používám ješte dost win api funkce, tak jestli není už nic v čem by mohl být problém ve VBA, bude problém tam.
Pokud je problém tedy v těch funkcích mimo VBA, napadá někoho jak jednoduše zjistit co všechno se z procedury volalo a zůstalo to neukončeno respektive stále to běží po ukončení procedury?
Ještě dotaz, je tedy možné, že knihovna, kterou registruju, do registru nic nezapisuje, proste je to jen na té knihovně jestli a co zapíše?
Vybral sis C/C++ což už samo je složitej jazyk. Začneš tak, že si seženeš nějakou knížku, případně na netu najdeš nějakej seriál (třeba tady na webu), kde se prokoušeš od základů po to komplikovaný..., ale komplikovanosti se nikdy nevyhneš, ono tedy bude záležet co chceš vytvořit, ale těžko uděláš jednoduše složité věci.
Dík za odpověď, až přijdu z práce tak to ještě trochu víc testnu, ale pouštěl jsem to s admin. právama a psalo to, že soubor byl úspěšně registrován, nicméně v regedit jsem žádnou změnu nenašel.
Snažím se proto, aby byl VBAčkovej prográmek přenositelnej na jiné počítače, takže pácham proceduru, která kontroluje reference jestli má počítač knihovny k dispozici a jestli mají správnou verzi (zatim věřim na kompatibilitu, takže pokud je instalována vyšší verze, tak to neřešim). Potřebuju pokud je potřeba dostat knihovnu do referencí v projektu.
Zdravím,
Nejdřív jsem zkoušel hledat na netu, ale nějak jsem stále nezjistil jak toto přesně funguje. Pokud tedy přes příkazový řádek něco registruju, zahlásí to že knihovna byla úspěšně registrována, ale nějak nevidím žádnou změnu, nebo co to udělalo. Takže jak by to mělo fungovat v případě, že knihovna kterou registruju už je registrována...ve variantách je registrována stejná verze, ale s jinou cestou; je registrována starší verze; již je registrována novější verze (mají verze souboru vůbec nějaký vliv)? Nebo jestli pokud je knihovna používána nejde přeregistrovat (nebo odregistrovat a následně registrovat), případně se změny projeví až po restartu?