[DELPHI] Co jest wykonywane przy starcie aplikacji?

0

Witam,

Mam nastepujacy problem. W OnClick Buttona mam cos takiego:

if 1>2 then
SetProcessAffinityMask(p_processh, MaskToSet and sys_affmask);

Funkcja ta nie wykona sie bo nie pozwala jej na to warunek. Natomiast przy starcie aplikacji na Win95 pojawia sie blad zwiazany z ta funkcja i plikiem Kernell32.dll (na XP jest dobrze). Sprawdzilem, ze blad pojawia sie Od razu po uruchomieniu aplikacji (jeszcze przed Form.Create) a przeciez funkcja ta jest wywolywana dopiero przy kliknieciu na buttona. Doszedlem do wniosku, ze przy uruchomieniu programu sprawdzane sa wszystkie funkcje uzyte w programie i teraz mam pytanie w jaki sposob wymusic uruchomienie programu bez sprawdzenia poprawnosci tej funkcji?

0

<font size="6">CZYTAĆ HELPa i MSDNa!!!!!</span>

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/setprocessaffinitymask.asp

Requirements
Client Requires Windows Vista, Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0.
Server Requires Windows Server "Longhorn", Windows Server 2003, Windows 2000 Server, or Windows NT Server 4.0.

0

@Misiekd
Pan Marcin już odkrył to co napisali w helpie i mogłeś oszczędzić sobie tego posta. Zadał pytanie : "w jaki sposob wymusic uruchomienie programu bez sprawdzenia poprawnosci tej funkcji?"

0

Myślę, że chodzi o statyczne dowołania do biblioteki dll. Przejrzyj pliki nagłówkowe tej funkcji i użyj jej jako załadowanej dynamicznie przez LoadLibrary/GetProcAddress.

0
AdamPL napisał(a)

@Misiekd
Pan Marcin już odkrył to co napisali w helpie i mogłeś oszczędzić sobie tego posta. Zadał pytanie : "w jaki sposob wymusic uruchomienie programu bez sprawdzenia poprawnosci tej funkcji?"

to chyba ma problemy z czytaniem ze zrozumieniem (podobnie jak Ty zresztą). Ta funkcja jest dostępna jedynie w windowsach

Requirements
Client Requires Windows Vista, Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0.
Server Requires Windows Server "Longhorn", Windows Server 2003, Windows 2000 Server, or Windows NT Server 4.0.

i w innych ndowsach NIE DA SIĘ JEJ UŻYĆ. Można zrobić #IF ale to działa podczas kompilacji.
ew. zobaczyć jak wygląda deklaracja tej funkcji i napisać własną z ładowaniem dynamicznym wymaganej przez nią biblioteki

0
Misiekd napisał(a)

<font size="6">CZYTAĆ HELPa i MSDNa!!!!!</span>

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/setprocessaffinitymask.asp

Requirements
Client Requires Windows Vista, Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0.
Server Requires Windows Server "Longhorn", Windows Server 2003, Windows 2000 Server, or Windows NT Server 4.0.

Szanowny kolego!

Wiem, ze wspomniana funkcje mozna wywolac tylko na Windows XP/2000/NT i dlatego przed jej wywolaniem (w OnClick buttona) sprawdzam wersje systemu. Ale problem dotyczy zupelnie czego innego. Blad nie pojawia sie przy wywolaniu tej funkcji ale przy starcie aplikacji jeszcze przed Form.Create! Dlatego sprawdzanie wersji systmu nic nie daje bo program wywala sie przez sama obecnosc tej funkcji w programie a nie przez jej wywolanie.

0
Misiekd napisał(a)

to chyba ma problemy z czytaniem ze zrozumieniem (podobnie jak Ty zresztą). Ta funkcja jest dostępna jedynie w windowsach

Przecież pan Marcin już to wie! Wie, że ta konkretna funkcja wyrzuca mu błąd gdy jest uruchamiana w Win95, wie że pod tym Windowsem mu nie pójdzie i wyobraź sobie on nawet to w swoim poście napisał...ale mimo tego, że już to wie to Ty wraz mu to uświadamiasz poprzez podanie linków do helpa i pisanie banialuków bukwami! Wyraźnie zapytał jak to ominąć a nie dlaczego mu to nie działa... I kto tu ma problemy z czytaniem ze zrozumieniem?

0
Szczawik napisał(a)

Myślę, że chodzi o statyczne dowołania do biblioteki dll. Przejrzyj pliki nagłówkowe tej funkcji i użyj jej jako załadowanej dynamicznie przez LoadLibrary/GetProcAddress.

Dzieki za wskazowke, bede kombinowal [browar]

0
AdamPL napisał(a)
Misiekd napisał(a)

to chyba ma problemy z czytaniem ze zrozumieniem (podobnie jak Ty zresztą). Ta funkcja jest dostępna jedynie w windowsach

Przecież pan Marcin już to wie! Wie, że ta konkretna funkcja wyrzuca mu błąd gdy jest uruchamiana w Win95, wie że pod tym Windowsem mu nie pójdzie i wyobraź sobie on nawet to w swoim poście napisał...ale mimo tego, że już to wie to Ty wraz mu to uświadamiasz poprzez podanie linków do helpa i pisanie banialuków bukwami! Wyraźnie zapytał jak to ominąć a nie dlaczego mu to nie działa... I kto tu ma problemy z czytaniem ze zrozumieniem?

Zgadza sie.

Dziwne, ze niektorym zrozumienie prostego pytania (zawartego w ostatnim zdaniu mojego posta) moze sprawic tyle problemu [???]

0
AdamPL napisał(a)

Przecież pan Marcin już to wie! Wie, że ta konkretna funkcja wyrzuca mu błąd gdy jest uruchamiana w Win95, wie że pod tym Windowsem mu nie pójdzie i wyobraź sobie on nawet to w swoim poście napisał...ale mimo tego, że już to wie to Ty wraz mu to uświadamiasz poprzez podanie linków do helpa i pisanie banialuków bukwami! Wyraźnie zapytał jak to ominąć a nie dlaczego mu to nie działa... I kto tu ma problemy z czytaniem ze zrozumieniem?

no to jak wie co i dlaczego mu powoduje ten błąd to gdzie jest problem??? Jeśli wie, że bibliteka jest ładowana statycznie to powinien też wiedzieć, że jest ona ładowana przy starcie programu. Jak nie statycznie bo tak źle to jedyne rozwiązanie ładować ją dynamicznie - innej opcji nie ma. Na to chyba nie trudno wpaść. Więc nadal nie wiem gdzie jest problem jeśli on to wszystko wie.

BTW jeśli program ma chodzić na W98 bez tej funkcji to na XP bez niej też będzie działał poprawnie :>
EDIT:
a co do pytania

w jaki sposob wymusic uruchomienie programu bez sprawdzenia poprawnosci tej funkcji?

to nie da się tego wymusić - można jedynie napisać włąsne wywołanie tej funkcji

0

Chyba Marcin chodzi Ci o coś takiego:

function MySetProcessAffinityMask(hProcess: THandle; dwProcessAffinityMask: DWORD):BOOL;
type TSetProcessAffinityMask = function (hProcess: THandle; dwProcessAffinityMask: DWORD): BOOL; stdcall;
var SetProcessAffinityMask:TSetProcessAffinityMask;
    DLL:THandle;
begin
result:=FALSE;
DLL:=LoadLibrary('kernel32.dll');
if (DLL<>0) then
  begin
  @SetProcessAffinityMask:=GetProcAddress(DLL, 'SetProcessAffinityMask');
  if (@SetProcessAffinityMask<>nil) then
    result:=SetProcessAffinityMask(hProcess, dwProcessAffinityMask);
  FreeLibrary(DLL);
  end;
end;
0
Misiekd napisał(a)

BTW jeśli program ma chodzić na W98 bez tej funkcji to na XP bez niej też będzie działał poprawnie :>

Program musi zawierac ta funkcje poniewaz moze uzywac tylko jednego procesora (dotyczy komputerow wieloprocesorowych z WinXP) ale dzialac ma tez na wszystkich pozostalych systemach Windows.

Misiekd napisał(a)

EDIT:
a co do pytania

w jaki sposob wymusic uruchomienie programu bez sprawdzenia poprawnosci tej funkcji?

to nie da się tego wymusić - można jedynie napisać włąsne wywołanie tej funkcji

To jest wlasnie konkretna i rzeczowa odpowiedz, nie mozna bylo tak od razu?

Pozdrawiam
Marcin

0
Szczawik napisał(a)

Chyba Marcin chodzi Ci o coś takiego:

Wielkie dzieki [browar]

Nie mam juz dzisiaj dostepu do komputera z Win95 wiec jutro rano bede testowal, ale to powinno rozwiazac moj problem.

Jeszcze raz dziekuje

Pozdrawiam
Marcin

1 użytkowników online, w tym zalogowanych: 0, gości: 1