Forms in DLL

Started by Anonymous, February 20, 2006, 03:51:55 PM

Previous topic - Next topic

Anonymous

I'd like to put a basic set of forms in a dll. How do I exchange global variables that I use in these forms now. Can I add extra parameters to the forms-functions for this purpose?

TechSupport

Create a function in your DLL that will accept the incoming variables. Just make sure to EXPORT it so that your exe can see it.

In your DLL:

Function SetVariables( AllVariables As GLOBAL_TYPE ) Export As Long


End Function


In your EXE:

Declare Sub SetVariables Lib "MYDLL.DLL" Alias "SETVARIABLES" _
           ( AllVariables As GLOBAL_TYPE )

Anonymous

Thanks a lot.

I've managed to put the specific standard forms in the DLL I'm writing.

Mark Strickland

Does this imply every variable in your main EXE becomes GLOBAL to the DLL?

If so how does it handle name conflicts among various functions?

If not does it just export the GLOBALS?

In the DLL carefully naming can handle conflicts if it makes everything GLOBAL.

Thanks.

TechSupport

The variables in the EXE and DLL are totally separate. One can not access the other. That is the reason that he wants to send the variables to the DLL (in order to access them). Therefore, you can have the same names without fear of any interference. The hassle becomes having to send the variables to the DLL, manipulate them as you need, and then send them back to the calling EXE.

Anonymous

I'm using this technique now and it works fine. I'd like to return the values inthe struct (TYPE) back to the application. I can do that with deperate finctions that read the struct in the DLL but I'd like to do that in one strocke (function).

Is that possible? Do I have to use pointers???

It would be great if I got some example code.

Thanx in advance.

TechSupport

TheEXE.bas

#Compile Exe

#Include "TheTYPE.inc"


Declare Sub SetVariables Lib "THEDLL.DLL" Alias "SETVARIABLES" (  AllVariables As GLOBAL_TYPE  )


Global MyTYPE As GLOBAL_TYPE


Function PBMain() As Long

  MyTYPE.nVar3 = "Paul Squires"

  ' Send the entire global MyTYPE to the DLL where
  ' it can be manipulated in the DLL.
  SetVariables MyTYPE
 
  ' Display what the value is now after it was changed in the DLL
  MsgBox MyTYPE.nVar3,,"EXE"
 
End Function


TheDLL.bas

#Compile Dll

#Include "TheTYPE.inc"

Global pType As GLOBAL_TYPE Ptr


Sub SetVariables( AllVariables As GLOBAL_TYPE ) Export

   
   MsgBox AllVariables.nVar3,,"DLL-IN"
   
   ' You can directly modify the incoming AllVariables Type
   ' elements and the changes will be sent automatically back
   ' up to the calling EXE (because it was sent to the DLL
   ' by reference, ByRef ).
   AllVariables.nVar3 = "Paul Squires - changed"

   ' Alternatively.....
   ' If you want other functions in your DLL to modify the
   ' incoming AllVariables TYPE, you can assign it to a
   ' pointer and directly manipulate it that way. In this
   ' case I assign it to a global pointer called pType.
   
   pType = VarPtr(AllVariables)
   
   @pType.nVar1 = 12345
   @pType.nVar2 = 19.99
   @pType.nVar3 = "3rd Type element changed via a pointer"
   
End Sub


TheTYPE.inc


Type GLOBAL_TYPE
  nVar1 As Long
  nVar2 As Single
  nVar3 As Asciiz * 100
End Type

Anonymous

If you want to make a custom control dll I'm prefer to use handle technic
because it can protect your internal code

In Exe
- Init your custom control to register it class and to allocate internal dll struct
    ex. InitMyControl(initvar)
- Place your custom control
- Use custom Handle and Id to get your control handle
- hwnd=Gethandle(Handle,Id)

so to set or get variable you have to use separate function/sub
- SetnVar1(hwnd,nVar1)
- nVar1=GetnVar1(hwnd)

In dll
sub InitMycontrol(byval initvar as string) 'ex for password
  if initvar=passvar then registermyclass
end sub

Type Mystruct
 nVar1 as Long
 nVar2 as Single
 nVar3 as string*4
End Type

you can alloc your struct when WM_CREATE in your callback

CASE WM_CREATE
     myhnd = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,   sizeof(mystruct))

then store your custom control handle into the extra window memory of a window

       SetWindowLong hWnd, 0, myhnd

then create your interface

function Gethandle(byval hwnd as long,byval id as long)as long
  hwnd=getdlgitem(hwnd,id)
  Gethandle=getwindowlong(hwnd,0)
end function

sub SetnVar1(hwnd,nvar1)
  myhndl=getwindowlong(hwnd,0)
  @myhndl.nvar1=nvar1
end sub

function GetnVar1(hwnd)as long
  myhndl=getwindowlong(hwnd,0)
  GetnVar1=@myhndl.nvar1
end sub

This technic also allow you to use multiple control in exe
Hope it can help you