VB.Net
Есть exe c функциями и dll создаваемая из exe
из exe все что в dll вижу и доступно
но надо при определенной ситуации в dll вызвать функцию из exe-ка ( а также функцию из еще одной dll этого exe-ка)
Надо посылать сообщения exe-ку и ловить их, если да то как
Никогда не сталкивалась с такой проблемой..
Подскажите плиз
Если все 3 составляющие задачи находятся в пределах 1-й сборки, то можно обойтись малой кровью..
Что мешает тебе передать в dll экземпляр того класса, в котором находится нужная функция? И у же там, при наступлении твоих определнных условий вызвать нужную тебе функцию...
Либо другой вариант:
-В dll , в классе, где происходит проверка твоего условия, определяешь какое событие, которое будешь генерировать при наступлении того самого условия..
-В ехе, создаешь экземпляр этого класса( из dll ) и подписываешься на то самое событие. И в обрабочике этого события вызываешь нужную тебе функцию.
Если же тебе необходимо вернуть результат вызова ф-и обратно в dll, то так же через параметр события объявленный как ByRef возвращаешь результат обратно..
Какая dll? Если stdcall (т.е. такая как kernel32.dll или user32.dll), то надо декларировать типа так:
Private Declare Sub AccessibleChildren Lib "OLEACC.dll" (ByRef ByRef paccContainer As IAccessible, ByVal iChildStart As Int32, ByVal cChildren As Int32, ByRef rgvarChildren As Variant, ByRef pcObtained As Int32)
Private Declare Function acmGetVersion Lib "msacm32.dll" () As Int32
Private Declare Function AddMonitor Lib "winspool.drv" Alias "AddMonitorA" (ByVal pName As String, ByVal Level As Int32, ByRef pMonitors As Byte) As Int32
Private Declare Function AreAnyAccessesGranted Lib "advapi32.dll" (ByVal GrantedAccess As Int32, ByVal DesiredAccess As Int32) As Int32
Private Declare Function CertAlgIdToOID Lib "crypt32.dll" (ByVal dwAlgId As Int32) As Int32
Private Declare Function CertRemoveEnhancedKeyUsageIdentifier Lib "crypt32.dll" (ByRef pCertContext As Int32, ByVal pszUsageIdentifier As String) As Int32
Если ActiveX или .Net, то подключи её к проекту (видимо придётся динамически, но тут я не помощник - учи reflection, а если статически) и работай как с обычным классом.
Звякнуть из библии в первом случае можно используя CallBack функции и делегаты:
Public Delegate Function FPtr( ByVal value As Integer ) As Boolean
Public Delegate Function FPtr2( ByVal value As String ) As Boolean
Public Class LibWrap
' Declares managed prototypes for unmanaged functions.
Declare Sub TestCallBack Lib "..\LIB\PinvokeLib.dll" ( ByVal cb _
As FPtr, ByVal value As Integer )
Declare Sub TestCallBack2 Lib "..\LIB\PinvokeLib.dll" ( ByVal cb2 _
As FPtr2, ByVal value As String )
End Class 'LibWrap
Public Class App
Public Shared Sub Main()
Dim cb As FPtr
cb = AddressOf App.DoSomething
Dim cb2 As FPtr2
cb2 = AddressOf App.DoSomething2
LibWrap.TestCallBack( cb, 99 )
LibWrap.TestCallBack2( cb2, "abc" )
End Sub 'Main
Public Shared Function DoSomething( ByVal value As Integer ) As Boolean
Console.WriteLine( ControlChars.CrLf + "Callback called with _
param: {0}", value )
…
End Function 'DoSomething
Public Shared Function DoSomething2( ByVal value As String ) As Boolean
Console.WriteLine( ControlChars.CrLf + "Callback called with _
param: {0}", value )
…
End Function 'DoSomething2
End Class 'App
Спасибо большое, попробую, но вот как событие DLL обявить дополнитеельно в exe не знаю...
Не подскажите?
Если событие наступит в DLL то и в exe оно само автоматически наступит? Я так поняла?
Спасибо
По шагам: библия содержит классы, которые имеют или не имеют события. Поэтому тебе надо в экзешнике объявить не сами события, а классы их содержащие. Но эти классы надо объявить с WithEvents. Ну или хэндлеры добавлять, если динамически, но это потом.