Does anyone know which module contains the WinMain function? I looked around but could not locate it. Thanks!
WinMain
BlitzMax Forums/BlitzMax Programming/WinMain none
Ok, then where's the module that contains the program's entry point function? And I'm not talking about bbStartup.
Have you got any context in which you're looking for it?
A search through my mod directories and using hotdocs shows nothing with winmain on my system.
Could it possibly be a third party module?
A search through my mod directories and using hotdocs shows nothing with winmain on my system.
Could it possibly be a third party module?
Ahhhh, are you sure you are posting in the correct thread. Maybe you wanted the SDK thread.....
tonyg,
I'm not sure. I think BMK may add it in and call bbStartup.
I'm not sure. I think BMK may add it in and call bbStartup.
No, I need this information for a BlitzMax app.
I only see references to it in FLTK (fltkmaxgui).
I still don't know in what context you're looking for it.
What makes you want to find winmain?
I still don't know in what context you're looking for it.
What makes you want to find winmain?
I going to write a module which will detect when a new instance of the application is launched, and will generate an event. I know how to go about accomplishing this I just need access to the WinMain/entry point function.
try this
process.bmx
then run this function
process.bmx
' ----------------------------------------------------------------------------- ' Process list... see which processes spawned which programs! ' ----------------------------------------------------------------------------- k32 = LoadLibraryA ("kernel32.dll") If Not k32 Then Notify "No kernel! Yikes!"; End Global CreateToolhelp32Snapshot (flags, th32processid) "Win32" = GetProcAddress (k32, "CreateToolhelp32Snapshot") Global Process32First (snapshot, entry:Byte Ptr) "Win32" = GetProcAddress (k32, "Process32First") Global Process32Next (snapshot, entry:Byte Ptr) "Win32" = GetProcAddress (k32, "Process32Next") Global Module32First (snapshot, entry:Byte Ptr) "Win32" = GetProcAddress (k32, "Module32First") Global Module32Next (snapshot, entry:Byte Ptr) "Win32" = GetProcAddress (k32, "Module32Next") Global Thread32First (snapshot, entry:Byte Ptr) "Win32" = GetProcAddress (k32, "Thread32First") Global Thread32Next (snapshot, entry:Byte Ptr) "Win32" = GetProcAddress (k32, "Thread32Next") Global Heap32First (snapshot, entry:Byte Ptr, th32heapid) "Win32" = GetProcAddress (k32, "Heap32First") Global Heap32Next (entry:Byte Ptr) "Win32" = GetProcAddress (k32, "Heap32Next") Global Heap32ListFirst (snapshot, entry:Byte Ptr) "Win32" = GetProcAddress (k32, "Heap32ListFirst") Global Heap32ListNext (snapshot, entry:Byte Ptr) "Win32" = GetProcAddress (k32, "Heap32ListNext") Global Toolhelp32ReadProcessMemory (th32processid, baseaddress, buffer:Byte Ptr, Read_bytes, _bytesread) "Win32" = GetProcAddress (k32, "Toolhelp32ReadProcessMemory") Global CloseHandle (_Object) "Win32" = GetProcAddress (k32, "CloseHandle") ' ----------------------------------------------------------------------------- ' PROCESSENTRY32 structure hack... ' ----------------------------------------------------------------------------- ' Hopefully won't have to do this in BlitzMax... hint hint, Mark... :) ' ----------------------------------------------------------------------------- Const SizeOf_PE32 = 296 Type PE32 Field bank:TBank ' dwSize.l ' cntUsage.l ' th32ProcessID.l ' th32DefaultHeapID.l ' th32ModuleID.l ' cntThreads.l ' th32ParentProcessID.l ' pcPriClassBase.l ' dwFlags.l ' szExeFile.b [#MAX_PATH] End Type Global PE32List:TList = CreateList () ' ----------------------------------------------------------------------------- ' ----------------------------------------------------------------------------- ' Create a new 'process' list entry... ' ----------------------------------------------------------------------------- Function CreatePE32:PE32 () p:PE32 = New PE32 ListAddLast PE32List, p p.bank = CreateBank (SizeOf_PE32) If p.bank PokeInt p.bank, 0, SizeOf_PE32 Else ListRemove PE32List, p Return Null EndIf Return p End Function ' ----------------------------------------------------------------------------- ' Free process list entry... ' ----------------------------------------------------------------------------- Function FreePE32 (p:PE32) If p.bank ListRemove PE32List, p EndIf End Function ' ----------------------------------------------------------------------------- ' Redundant info... ' ----------------------------------------------------------------------------- Function PrintProc (bank) Print "" Print "Name : " + ProcessName$ (bank) Print "Usage : " + PeekInt (bank, 4) Print "Proc ID : " + PeekInt (bank, 8) Print "Heap ID : " + PeekInt (bank, 12) Print "Mod ID : " + PeekInt (bank, 16) Print "Threads : " + PeekInt (bank, 20) Print "Parent : " + PeekInt (bank, 24) Print "ClasBas : " + PeekInt (bank, 28) Print "Flags : " + PeekInt (bank, 32) End Function ' ----------------------------------------------------------------------------- ' Eeuurrggghhhh... leech process name from bank... ' ----------------------------------------------------------------------------- Function ProcessName$ (bank:TBank) For s = 36 To BankSize (bank) - 1 _byte = PeekByte (bank, s) If _byte result$ = result$ + Chr (_byte) Else Exit EndIf Next Return result$ End Function Global PROC_COUNT ' ----------------------------------------------------------------------------- ' Constants required by process functions, etc... ' ----------------------------------------------------------------------------- Const TH32CS_SNAPHEAPLIST = $1 Const TH32CS_SNAPPROCESS = $2 Const TH32CS_SNAPTHREAD = $4 Const TH32CS_SNAPMODULE = $8 Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE) Const TH32CS_INHERIT = $80000000 Const INVALID_HANDLE_VALUE = -1 Const MAX_PATH = 260 ' ----------------------------------------------------------------------------- ' Take snapshot of running processes... ' ----------------------------------------------------------------------------- Function CreateProcessList () PROC_COUNT = 0 Return CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0) End Function ' ----------------------------------------------------------------------------- ' Free list of processes (created via CreateProcessList and GetProcesses)... ' ----------------------------------------------------------------------------- Function FreeProcessList (snap) For p:PE32 = EachIn PE32List FreePE32 (p) Next CloseHandle (snap) PROC_COUNT = 0 End Function Function GetProcesses (snap) PROC_COUNT = 0 ' Check snapshot is valid... If snap <> INVALID_HANDLE_VALUE ' Hack up a PE32 (PROCESSENTRY32) structure... p:PE32 = CreatePE32 () ' Find the first process, stick info into PE32 bank... If Process32First (snap, BankBuf (p.bank)) ' Increase global process counter... PROC_COUNT = PROC_COUNT + 1 Repeat ' Create a new PE32 structure for every following process... p:PE32 = CreatePE32 () ' Find the next process, stick into PE32 bank... nextproc = Process32Next (snap, BankBuf (p.bank)) ' Got one? Increase process count. If not, free the last PE32 structure... If nextproc PROC_COUNT = PROC_COUNT + 1 Else FreePE32 (p) EndIf ' OK, no more processes... Until nextproc = 0 Else ' No first process found, so delete the PE32 structure it used... FreePE32 (p) Return False EndIf Return True Else Return False EndIf End Function ' ----------------------------------------------------------------------------- ' Fill treeview gadget... ' ----------------------------------------------------------------------------- Function FillProcessTree (root:TGadget) snap = CreateProcessList () If GetProcesses (snap) For p:PE32 = EachIn PE32List pid = PeekInt (p.bank, 8) parent = PeekInt (p.bank, 24) proc$ = ProcessName$ (p.bank) nodey = AddTreeViewNode (proc$, root) CompareProcs (p, nodey) Next FreeProcessList (snap) Else Notify "Failed to create process list!", True EndIf End Function Function FindProcessbyname(nname$) Local oneggo = 0 snap = CreateProcessList () If GetProcesses (snap) For p:PE32 = EachIn PE32List pid = PeekInt (p.bank, 8) parent = PeekInt (p.bank, 24) proc$ = ProcessName$ (p.bank) If Instr(Lower(proc$),Lower(nname$)) <> 0 And oneggo > 0 Then ' FreeProcessList (snap) Return True Else If Instr(Lower(proc$),Lower(nname$)) <> 0 Then oneggo = oneggo + 1 EndIf 'node = AddTreeViewNode (proc$, root) 'CompareProcs (p, nodey) Print proc$+" oneggo "+oneggo Next FreeProcessList (snap) Else Notify "Failed to create process list!", True EndIf Return False End Function ' ----------------------------------------------------------------------------- ' Find child processes (ah, the joys of trial and error)... ' ----------------------------------------------------------------------------- Function CompareProcs (p:PE32, pnode:TGadget) For q:PE32 = EachIn PE32List If p <> q pid = PeekInt (p.bank, 8) qid = PeekInt (q.bank, 8) qparent = PeekInt (q.bank, 24) If pid = qparent proc$ = ProcessName (q.bank) nodey = AddTreeViewNode (proc$, pnode) CompareProcs (q, nodey) ListRemove PE32List, q EndIf EndIf Next End Function ' ----------------------------------------------------------------------------- ' D E M O . . . ' ----------------------------------------------------------------------------- ' Slight oddity: if it crashes, try sticking a second's Delay () in here. Seems ' to sometimes do this when run from the IDE (maybe snapshotting while a process ' is being spawned is buggy in Windoze? That's my story and I'm sticking to it)...
then run this function
If FindProcessbyname("INSERT PROG NAME HERE") = True Then End
basically that will kill the app if another instance of it is already running.
BlitzMax does use main() - see appstub.win32.c