Newsgroup: it.comp.lang.visual-basic
Titolo: E' possibile sapere il nome del client che crea l'istanza di un oggetto?

Salve a tutti,
vorrei sapere se è possibile sapere il nome del client che crea
l'istanza di un oggetto. Mi spiego meglio. Ho una dll che desidero che
venga usata solo dal mio eseguibile, e non sia utilizzabile in
ambiente di programmazione.
Grazie

 ha scritto nel messaggio

[Assembly].GetEntryAssembly()
Ciao 

 [Assembly].GetEntryAssembly()
Ciao Fabio, e grazie per la risposta.
Ho dimenticato di specificare che mi serve farlo in VB6 e non in .Net.
Esiste un metodo anche in VB6 o mi suicido???? :((
Grazie.

 ha scritto nel messaggio 
news:1174945634....@y80g2000hsf.googlegroups.com...

Ti va di lusso, anni fa feci la stessa domanda :)
Però funziona solo se l'eseguibile ha almeno un form:
chiami la GetModuleFileNameByHwnd() passandogli l'HWnd del form.
Se lo fai in debug dato che il programma gira nello stesso processo di VB6 
otterrai come risultato "percorso\VB6.exe"
Ciao
---
Private Const PROCESS_ALL_ACCESS = 2035711
Private Const VER_PLATFORM_WIN32_NT = 2
Private Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Type OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion As String * 128      '  Stringa di manutenzione 
utilizzata dai servizi di supporto tecnico
End Type
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or 
TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Const MAX_PATH As Integer = 260
Const MAX_MODULE_NAME32 = 256
Private Type MODULEENTRY32
  dwSize As Long
  th32ModuleID As Long
  th32ProcessID  As Long
  GlblcntUsage As Long
  ProccntUsage  As Long
  modBaseAddr As Long
  modBaseSize  As Long
  hModule  As Long
  szModule As String * MAX_MODULE_NAME32
  szExePath As String * MAX_PATH
End Type
Dim OSVersInfo As OSVERSIONINFO
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd 
As Long, lpdwProcessId As Long) As Long
Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
' For WinNT/2k/Xp
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess 
As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetModuleFileNameEx Lib "Psapi.dll" Alias 
"GetModuleFileNameExA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal 
lpFileName As String, ByVal nSize As Long) As Long
Private Declare Function EnumProcessModules Lib "Psapi.dll" (ByVal hProcess 
As Long, ByRef hModules() As Long, ByVal cb As Long, ByRef lpcbNeeded As 
Long) As Boolean
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" 
(ByRef lpVersionInformation As OSVERSIONINFO) As Long
' for Win9x
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal 
lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Module32First Lib "kernel32" (ByVal hSnapshot As 
Long, lpme As MODULEENTRY32) As Long
Public Function GetModuleFileNameByHwnd(ByVal hwnd As Long) As String
    Dim pID As Long, thID As Long
    Dim hProcess As Long
    Dim fName As String
    Dim numChars As Long
    Dim hModules() As Long
    Dim cbNeeded As Long
    OSVersInfo.dwOSVersionInfoSize = Len(OSVersInfo)
    Call GetVersionEx(OSVersInfo)
    Select Case OSVersInfo.dwPlatformId
        Case VER_PLATFORM_WIN32_WINDOWS
            Dim uModule As MODULEENTRY32
            Dim hSnapshot As Long
            Call GetWindowThreadProcessId(hwnd, pID)
            hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pID)
            uModule.dwSize = Len(uModule)
            Call Module32First(hSnapshot, uModule)
            'Do While r
            '    r = Module32Next(hSnapshot, uProcess)
            'Loop
            CloseHandle hSnapshot
            pID = InStr(1, uModule.szExePath, Chr$(0), vbBinaryCompare)
            If (pID > 0) Then
                GetModuleFileNameByHwnd = Left$(uModule.szExePath, InStr(1, 
uModule.szExePath, Chr$(0), vbBinaryCompare) - 1)
            Else
                GetModuleFileNameByHwnd = vbNullString
            End If
        Case VER_PLATFORM_WIN32_NT
            thID = GetWindowThreadProcessId(hwnd, pID)
            hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, pID)
            ReDim hModules(0 To 0) As Long
            If (EnumProcessModules(hProcess, hModules, 1, cbNeeded) = False) 
Then
                ReDim hModules(0 To cbNeeded)
                Call EnumProcessModules(hProcess, hModules, cbNeeded, 
cbNeeded)
            End If
            fName = Space$(255)
            numChars = GetModuleFileNameEx(hProcess, hModules(0), fName, 
255)
            Call CloseHandle(hProcess)
            GetModuleFileNameByHwnd = Left$(fName, numChars)
    End Select
End Function

Ciao Fabio,
scusa per il ritardo, ho letto solo oggi la tua risposta.
In effetti, dovrei richiamare la tua funzione dalla Class_Initialize
di ogni mia classe, e non dal client. In questo modo, ogni classe "sa"
chi la sta usando, e se è VB6 fa una Err.Raise...
E' folle?
Ciao e grazie.


Non è folle: se la tua classe è in una DLL ActiveX (quindi in-process) puoi
ad esempio usare l'API GetCommandLine, che restituisce la linea di comando
utilizzata per avviare l'exe "client" (compreso il percorso dell'exe
stesso).
Se questa contiene "vb6.exe" è molto verosimile che sia usata nell'ambiente
di sviluppo di VB.
Qui trovi un esempio:
http://www.devx.com/vb2themax/Tip/18377
In questo esempio a te interessa testare la variabile exePath
Bye
Raf

 Raf
Grazie, Raf!
domani ci provo...
Bye