Announcement

Collapse
No announcement yet.

Variables Exported From A Dll

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Variables Exported From A Dll

    We can use the Alias clause of the Declare statement to specify the symbol name as it appears within the dll itself. This is particularly useful if the actual name of the symbol would violate PowerBASIC naming conventions. However, procedures are not the only entities exported from dlls. I would not know how to go about using a variable exported from a dll if it did not satisfy PowerBASIC naming conventions. I believe this might be the case with variables preceded with an underscore character, as is Microsoft's proclivity. An example would be _iob, which is an array of FILE struct type. Would anyone know how this could be handled to access such a variable in PowerBASIC?
    Fred
    "fharris"+Chr$(64)+"evenlink"+Chr$(46)+"com"

  • #2
    You mean parameters, right? Parameters in a DECLARE can be any PB-compatible name, or no name at all. Example:

    Code:
    Declare Function ABC LIB "LIB.DLL" (Byte, Word, Long, Quad) As Long
    kgpsoftware.com | Slam DBMS | PrpT Control | Other Downloads | Contact Me

    Comment


    • #3
      Unfortunately not

      Using the declension specification attribute in a C dll its possible to export symbols other than functions, i.e., arrays, structs, etc. At least, that is my understanding of C and Dlls, even though I've personally never exported anything other than functions from a dll. For example, if you have a variable iSum in a dll and you want to export that variable you would do this in the dll's variable declaration...

      __declspec(dllexport) int iSum;

      In the C Run Time Module "msvcrt.dll" there is what I believe to be an array of structs of FILE type exported which I need access to. Using T. Rienow's (from Source Code) utility for dumping the Exports from a dll I dumped msvcrt's and this is the symbol I'm interested in...

      _iob

      It is defined as an extern in stdio.h

      _CRTIMP extern FILE _iob[];

      That's a variable, not a function right? And I can't access it from PowerBASIC due to the leading underscore. I can access it no problem from VC++ 6, and in fact the intellisense editor recognizes it when I start typing it in. In this latter language I have accomplished with it what I need, but would like also to be able to access it in PowerBASIC. I realize my need might be extremely rare, but nontheless I was wondering if its possible. I was hoping by posting this here someone could show me how I'm not thinking right about something and perhaps shed some light on this for me. Otherwise, I wish I could access variables such as this with PB. Thoughts?
      Fred
      "fharris"+Chr$(64)+"evenlink"+Chr$(46)+"com"

      Comment


      • #4
        The PB/Windows compiler does not support the export of anything but procedures from Dynamic Link Libraries; nor does it support the import of anything but procedures.

        If you want to 'share' variables across code modules, you will have to do it via passed parameters or by using a Windows object (eg. an atom).

        MCM
        Michael Mattias
        Tal Systems (retired)
        Port Washington WI USA
        [email protected]
        http://www.talsystems.com

        Comment


        • #5
          Thanks Michael. That's what I was afraid of. Looks like I'm stuck then.
          Fred
          "fharris"+Chr$(64)+"evenlink"+Chr$(46)+"com"

          Comment


          • #6
            Natively not, but you can do it with LoadLibrary and GetProcAddress.

            Code:
            #COMPILE EXE
            #DIM ALL
            #INCLUDE "WIN32API.INC"
            
            TYPE iobuf
               ptr AS ASCIIZ PTR
               cnt AS LONG
               base AS ASCIIZ PTR
               flag AS LONG
               file AS LONG
               charbuf AS LONG
               bufsiz AS LONG
               tmpfname AS ASCIIZ PTR
            END TYPE
            
            FUNCTION PBMAIN () AS LONG
            
               LOCAL hLib AS DWORD
               LOCAL piob AS iobuf PTR
            
               hLib = LoadLibrary("msvcrt.dll")
               IF hLib THEN
                  piob = GetProcAddress(hLib, "_iob")
                  IF piob THEN
                     MSGBOX STR$(@piob[0].bufsiz)
                  END IF
                  FreeLibrary hLib
               END IF
            
            END FUNCTION
            Last edited by José Roca; 28 Sep 2007, 01:40 PM.
            Forum: http://www.jose.it-berater.org/smfforum/index.php

            Comment


            • #7
              Fred,

              Are you writing the dll, or do you not have access to
              the dll code?
              Roy Cline

              Comment


              • #8
                Jose, i don't understand your example.

                Does your example lacks a call dword or is this something i am unfamiliar with ?
                hellobasic

                Comment


                • #9
                  Well then, maybe I'm not dead yet...

                  Roy,

                  I'd be the first to admit, its a silly thing I'm doing, but am trying to do it anyway. I certainly didn't write msvcrt.dll! I'm trying to re-initialize the standard output handle for printf output to a console window created with AllocConsole() in a GUI PowerBASIC app. According to Microsoft, the problem with it is that the CRT runtime I/O handles are zeroed out at the initialization of a GUI process. You can get valid I/O handles in the GUI process for AllocConsole() I/O, but the CRT functions are 'zilched' (No problem with Api functions though). Microsoft has a fix that is quite easy to apply in VC++, but its something of a struggle in PB. All the details of my little quest are to be found here...

                  http://www.powerbasic.com/support/pb...ad.php?t=34989

                  But in short, this is all that is required in a C GUI app to bring up a console and printf to it...

                  FILE *hf;

                  AllocConsole();
                  hCrt=_open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE),_O_TEXT);
                  hf = _fdopen( hCrt, "w" );
                  _iob[1]=*hf;
                  //*stdout = *hf;

                  I had to do a lot of complex DECLARES from stdio.h in PB to get to the point where I could make it work in PB, but the very last thing holding me up (right on the verge of success, I think) was that last _iob[1]=*hf statement where a re-obtained standard output handle is re-instated within an array of FILE structs in msvcrt.dll. Maybe after I get this working I'll try to do something productive!

                  But Jose says I can get the address of an array with GetProcAddress()? I didn't know that and am going to check it out right now. But there is still that blasted issue with the underscore, No?
                  Last edited by Fred Harris; 28 Sep 2007, 02:59 PM. Reason: declare var in C code so as to avoid confusion
                  Fred
                  "fharris"+Chr$(64)+"evenlink"+Chr$(46)+"com"

                  Comment


                  • #10
                    Originally posted by Edwin Knoppert View Post
                    Jose, i don't understand your example.

                    Does your example lacks a call dword or is this something i am unfamiliar with ?
                    Apparently, something you are unfamiliar with.

                    GetProcAddress retrieves the address of an exported function or variable from the specified dynamic-link library (DLL).

                    If it is a function or procedure, you have to use CALL DWORD to call it, but if it is a variable and GetProcAddress returns its address, you simply have to declare a pointer variable of the needed type and deference it.

                    But there is still that blasted issue with the underscore, No?
                    No. It is passed to GetProcAddess as an string, so where is the problem? Notice that I'm using piob = GetProcAddress(hLib, "_iob").
                    Last edited by José Roca; 28 Sep 2007, 04:21 PM.
                    Forum: http://www.jose.it-berater.org/smfforum/index.php

                    Comment


                    • #11
                      Awesome!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                      Jose, you did it again!!!!!!!!!!

                      Here is the finished code!

                      Code:
                      #Compile Exe
                      #Include "Win32api.inc"
                      %IDC_BUTTON1 = 1250
                      %IDC_EDIT    = 1255
                      %O_TEXT      = &H4000
                      
                      Type FILE
                        pChar        As Asciiz Ptr
                        cnt          As Long
                        pBase        As Asciiz Ptr
                        flag         As Long
                        fil          As Long
                        charbuf      As Long
                        bufsize      As Long
                        TmpFileName  As Asciiz Ptr
                      End Type
                      
                      
                      Declare Function fopen CDecl Lib "msvcrt.dll" Alias "fopen" _
                      ( _
                        ByRef pszFileName    As Asciiz, _
                        ByRef pszAttributes  As Asciiz _
                      ) As Dword
                      
                      
                      Declare Function fprintf CDecl Lib "msvcrt.dll" Alias "fprintf" _
                      ( _
                        ByVal fPtr As FILE Ptr, _
                        szFmtStr As Asciiz _
                        [, _
                           ByVal lpVar1 As Any, _
                           ByVal lpVar2 As Any, _
                           ByVal lpVar4 As Any _
                        ] _
                      ) As Long
                      
                      
                      Declare Function fclose CDecl Lib "msvcrt.dll" Alias "fclose" _
                      ( _
                        ByVal fPtr As FILE Ptr _
                      ) As Long
                      
                      
                      Declare Function printf CDecl Lib "msvcrt.dll" Alias "printf" _
                      ( _
                        szFmtStr As Asciiz _
                        [, _
                           ByVal lpVar1 As Any, _
                           ByVal lpVar2 As Any, _
                           ByVal lpVar3 As Any, _
                           ByVal lpVar4 As Any _
                        ] _
                      ) As Long
                      
                      
                      Declare Function Open_OSFileHandle CDecl Lib "msvcrt.dll" Alias "_open_osfhandle" _
                      ( _
                        ByVal hHandle As Long, _
                        ByVal iType   As Long _
                      ) As Long
                      
                      
                      Declare Function FDOpen CDecl Lib "msvcrt.dll" Alias "_fdopen" _
                      ( _
                        ByVal hHandle As Long, _
                        ByRef pszStr As Asciiz _
                      ) As Dword
                      
                      
                      Function WndProc(ByVal hWnd As Long,ByVal wMsg As Long,ByVal wParam As Long,ByVal lParam As Long) As Long
                        Select Case wMsg
                          Case %WM_CREATE
                            Local hButton As Dword
                            Local hIns As Dword
                            hIns=GetModuleHandle(ByVal 0)      'Another of the various ways of obtaining this value.
                            hButton=CreateWindowEx(0,"button","Button #1",%WS_CHILD Or %WS_VISIBLE,85,60,100,25,hWnd,%IDC_BUTTON1,hIns,ByVal 0)
                            WndProc=0
                            Exit Function
                          Case %WM_COMMAND
                            If LoWrd(wParam)=%IDC_BUTTON1 And HiWrd(wParam)=%BN_CLICKED Then
                               Local hStdOutput As Dword
                               Local hf As FILE Ptr
                               Local hCrt As Long
                               Local ptrFile As FILE Ptr
                               Local hLib As Dword
                               hLib=LoadLibrary("msvcrt.dll")
                               If hLib Then
                                  Call AllocConsole()
                                  hCrt=Open_OSFileHandle(GetStdHandle(%STD_OUTPUT_HANDLE),%O_TEXT)
                                  hf=FDOpen(hCrt,"w")
                                  ptrFile=GetProcAddress(hLib,"_iob")
                                  @ptrFile[1][email protected]
                                  '_iob[1][email protected]
                                  printf("My Name Is Fred!")
                                  Call FreeLibrary(hLib)  
                               End If
                            End If
                            WndProc=0
                            Exit Function
                          Case %WM_DESTROY
                            Call PostQuitMessage(0)
                            WndProc=0
                            Exit Function
                        End Select
                      
                        WndProc=DefWindowProc(hWnd, wMsg, wParam, lParam)
                      End Function
                      
                      Function WinMain(ByVal hIns As Long, ByVal hPrev As Long, ByVal lpCL As Asciiz Ptr, ByVal iShow As Long) As Long
                        Local szBuffer As Asciiz * 32
                        Local wc As WNDCLASSEX
                        Local Msg As tagMsg
                        Local hWnd As Dword
                      
                        szBuffer="SetGetWindowText"                         : wc.lpszClAssName=VarPtr(szBuffer)
                        wc.lpfnWndProc=CodePtr(WndProc)                     : wc.cbSize=SizeOf(wc)
                        wc.style=%CS_HREDRAW Or %CS_VREDRAW                 : wc.hInstance=hIns
                        wc.cbClsExtra=0                                     : wc.cbWndExtra=0
                        wc.hIcon=LoadIcon(%NULL, ByVal %IDI_APPLICATION)    : wc.hCursor=LoadCursor(%NULL, ByVal %IDC_ARROW)
                        wc.hbrBackground=%COLOR_BTNFACE+1                   : wc.lpszMenuName=%NULL
                        Call RegisterClAssEx(wc)
                        szBuffer="Caption = GetSetWindowText()"
                        hWnd=CreateWindow("SetGetWindowText",szBuffer,%WS_OVERLAPPEDWINDOW,200,100,280,200,0,0,hIns,ByVal 0)
                        Call ShowWindow(hWnd,iShow)
                        Call UpdateWindow(hWnd)
                        While GetMessage(Msg,%NULL,0,0)
                          TranslateMessage Msg
                          DispatchMessage Msg
                        Wend
                      
                        Function=msg.wParam
                      End Function
                      
                      'long fnWndProc_OnCommand(lpWndEventArgs Wea)
                      '{
                      ' unsigned int i;
                      ' int hCrt;
                      ' FILE *hf,*fp;
                      '
                      ' if(LOWORD(Wea->wParam)==IDC_BUTTON)
                      ' {
                      '    fp=fopen("C:\\Tallies\\Output.txt","w");
                      '    fprintf(fp,"_O_TEXT = %u\n",_O_TEXT);
                      '    AllocConsole();
                      '    hCrt=_open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE),_O_TEXT);
                      '    hf = _fdopen( hCrt, "w" );
                      '    *stdout = *hf;
                      '    i = setvbuf( stdout, NULL, _IONBF, 0 );
                      '    printf("My Name Is Fred!\n");
                      '    fclose(fp);
                      '    MessageBox(Wea->hWnd,"Hopefully, You See A Console?","See A Console?",MB_ICONINFORMATION);
                      ' }
                      '
                      ' return 0;
                      '}
                      '
                      Last edited by Fred Harris; 28 Sep 2007, 03:25 PM. Reason: add Call FreeLibrary(hLib)
                      Fred
                      "fharris"+Chr$(64)+"evenlink"+Chr$(46)+"com"

                      Comment


                      • #12
                        next act, please....

                        Ok, Now that we've shown that we can use printf anywhere and everywhere we want in a PowerBASIC app, get the hottest C programmer you can find and get him\her to use PRINT in a C app!
                        Fred
                        "fharris"+Chr$(64)+"evenlink"+Chr$(46)+"com"

                        Comment


                        • #13
                          This is a great example of why I am so against "verb-for-verb, function-for-function" conversions of software written in other languages.

                          Converting this code took oodles of reasonably obscure code, several assumptions about EXPORTs from a third-party library (the c runtime) and who knows how much time and talent.

                          Seems to me just a smidgeon of 'thinking before acting' would have determined the challenge was simply "Display formatted string to STDOUT" and the solution (AllocConsole + USING$) would have been self-evident.

                          MCM
                          Michael Mattias
                          Tal Systems (retired)
                          Port Washington WI USA
                          [email protected]
                          http://www.talsystems.com

                          Comment


                          • #14
                            IIRC, there was a much easier way to do this posted a few years ago in these forums. That example had exactly the same problem - not everything in the formatting string is interpreted here, so formatting codes that C programmers expect to work don't work here:

                            ...
                            LOCAL buf AS STRING
                            LOCAL age AS LONG
                            buf = "Jenny"
                            age = 4
                            printf("My Name Is \t%s! I am %ld years old.\n", STRPTR(buf), age)
                            CALL FreeLibrary(hLib)
                            ...

                            The substitutions work fine, but the \t and \n are simply passed through as is, rather than being interpreted as $TAB and $CRLF.

                            Also, It would be difficult for the old C programmer in me not to end the printf() with a proper ;
                            --pdf

                            Comment


                            • #15
                              Code:
                              printf("My Name Is \t%s! I am %ld years old.\n", STRPTR(buf), age)
                              ==>
                              STDOUT USING$ ("My name is " & $TAB &"&_! I am # years old." & $CRLF, buf,age)
                              Michael Mattias
                              Tal Systems (retired)
                              Port Washington WI USA
                              [email protected]
                              http://www.talsystems.com

                              Comment


                              • #16
                                Justification

                                The goal was more the journey than the destination, I suppose. I hope no one lost too much time fooling with it. I believes it shows the versatility of PowerBASIC pretty well.

                                I'm assuming there were easier ways to accomplish the same thing. And the fundamental issue had nothing to do with printf's \t, \n, \whatever escape sequences which are meaningful only within the C implementation of the function, or rather, to the C preprocessor.

                                What amazes me most is that nowhere in the documentation of the GetProcAddress Api does it state that that function returns the address of exported symbols other than functions, although it probably didn't make sense to implement the function any other way. That is definitely a tid bit of somewhat exotic info that will stick with me for a bit. Below is a somewhat more polished version of the program with some extraneous functions removed as well as some comments. I'm very grateful to all those who helped me with this.

                                Code:
                                'Program demonstrates how to restore standard output handle in C Runtime Library
                                'which is zeroed out by initialization of GUI process.
                                #Compile Exe
                                #Include "Win32api.inc"           'Translation of Windows.h for PowerBASIC
                                %IDC_BUTTON1 = 1250               'ctrl id of button
                                %O_TEXT      = &H4000             'from Fcntl.h
                                
                                Type FILE      'From stdio.h      'When a GUI application is started the three standard OS handles
                                  pChar        As Asciiz Ptr      'STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, and STD_ERROR_HANDLE are all
                                  cnt          As Long            'zeroed out by the console initialization routines.  These three
                                  pBase        As Asciiz Ptr      'handles are replaced by valid values when a GUI application calls
                                  flag         As Long            'AllocConsole(). Therefore, once this is done, calling GetStdHandle()
                                  fil          As Long            'will always return valid handle values. The problem is that the
                                  charbuf      As Long            'CRT has already completed initialization before an application gets
                                  bufsize      As Long            'a chance to call AllocConsole(); the three low I/O handles 0, 1,
                                  TmpFileName  As Asciiz Ptr      'and 2 have already been set up to use the original zeroed out OS
                                End Type                          'handles, so all CRT I/O is sent to invalid OS handles and CRT output
                                                                  'does not appear in the console.
                                
                                Declare Function printf CDecl Lib "msvcrt.dll" Alias "printf" _   'printf from stdio.h
                                ( _
                                  szFmtStr As Asciiz _
                                  [, _
                                     Byval lpVar1 As Any, _
                                     Byval lpVar2 As Any, _
                                     Byval lpVar3 As Any, _
                                     Byval lpVar4 As Any _
                                  ] _
                                ) As Long
                                
                                
                                Declare Function Open_OSFileHandle CDecl Lib "msvcrt.dll" Alias "_open_osfhandle" _  'from IO.h
                                ( _
                                  Byval hHandle As Long, _
                                  Byval iType   As Long _
                                ) As Long
                                
                                
                                Declare Function FDOpen CDecl Lib "msvcrt.dll" Alias "_fdopen" _   'from stdio.h
                                ( _
                                  Byval hHandle As Long, _
                                  ByRef pszStr As Asciiz _
                                ) As Dword
                                
                                
                                Function WndProc(Byval hWnd As Long,Byval wMsg As Long,Byval wParam As Long,Byval lParam As Long) As Long
                                  Select Case wMsg
                                    Case %WM_CREATE
                                      Local hButton As Dword
                                      Local hIns As Dword
                                      hIns=GetModuleHandle(Byval 0)
                                      hButton=CreateWindow("button","Show Console!",%WS_CHILD Or %WS_VISIBLE,110,65,200,25,hWnd,%IDC_BUTTON1,hIns,Byval 0)
                                      WndProc=0
                                      Exit Function
                                    Case %WM_COMMAND
                                      If Lowrd(wParam)=%IDC_BUTTON1 And HiWrd(wParam)=%BN_CLICKED Then
                                         Local hStdOutput As Dword              'Standart Output Handle
                                         Local hf,ptrFile As FILE Ptr           'FILE *
                                         Local hDll,hCrt,dwWeight As Dword
                                         hDll=LoadLibrary("msvcrt.dll")         'Load/Increment Reference Count on msvcrt.dll
                                         If hDll Then                           'Get base address of exported symbol _iob from msvcrt.dll.  _iob is an
                                            ptrFile=GetProcAddress(hDll,"_iob") 'array of FILE structs that holds the stdin, stdout, and stderr handles.
                                            Call AllocConsole()                 'These handels are zeroed out at initialization of a GUI process, and
                                            hCrt=Open_OSFileHandle(GetStdHandle(%STD_OUTPUT_HANDLE),%O_TEXT) 'must be reset with valid operating system
                                            hf=FDOpen(hCrt,"w")                 'handles if console output is desired in a GUI process.  With a valid
                                            @ptrFile[1][email protected]                     'handel to stdout returned in hf, it is restored back in position 1
                                            dwWeight=210                        'of the i/o buffer FILE array with @[email protected]
                                            printf("My Name Is Fred And I Weigh %u Pounds!"+$Cr+$Lf,dwWeight)  'printf output using CRT in PowerBASIC!
                                            Call FreeLibrary(hDll)              'Free/decrement reference count on msvcrt.dll
                                         End If
                                      End If
                                      WndProc=0
                                      Exit Function
                                    Case %WM_DESTROY
                                      Call PostQuitMessage(0)
                                      WndProc=0
                                      Exit Function
                                  End Select
                                
                                  WndProc=DefWindowProc(hWnd, wMsg, wParam, lParam)
                                End Function
                                
                                Function WinMain(Byval hIns As Long, Byval hPrev As Long, Byval lpCL As Asciiz Ptr, Byval iShow As Long) As Long
                                  Local szBuffer As Asciiz * 64
                                  Local wc As WNDCLASSEX
                                  Local Msg As tagMsg
                                  Local hWnd As Dword
                                
                                  szBuffer="Console_Output"                           : wc.lpszClAssName=Varptr(szBuffer)
                                  wc.lpfnWndProc=Codeptr(WndProc)                     : wc.cbSize=Sizeof(wc)
                                  wc.style=%CS_HREDRAW Or %CS_VREDRAW                 : wc.hInstance=hIns
                                  wc.cbClsExtra=0                                     : wc.cbWndExtra=0
                                  wc.hIcon=LoadIcon(%NULL, Byval %IDI_APPLICATION)    : wc.hCursor=LoadCursor(%NULL, Byval %IDC_ARROW)
                                  wc.hbrBackground=%COLOR_BTNFACE+1                   : wc.lpszMenuName=%NULL
                                  Call RegisterClAssEx(wc)
                                  szBuffer="GUI Console Output With C Runtime Library From PowerBASIC!"
                                  hWnd=CreateWindow("Console_Output",szBuffer,%WS_OVERLAPPEDWINDOW,500,500,440,200,0,0,hIns,Byval 0)
                                  Call ShowWindow(hWnd,iShow)
                                  Call UpdateWindow(hWnd)
                                  While GetMessage(Msg,%NULL,0,0)
                                    TranslateMessage Msg
                                    DispatchMessage Msg
                                  Wend
                                
                                  Function=msg.wParam
                                End Function
                                Last edited by Fred Harris; 29 Sep 2007, 10:24 PM. Reason: correct mis-statement
                                Fred
                                "fharris"+Chr$(64)+"evenlink"+Chr$(46)+"com"

                                Comment


                                • #17
                                  http://msdn2.microsoft.com/en-us/library/ms683212.aspx

                                  "GetProcAddress Function

                                  Retrieves the address of an exported function or variable from the specified dynamic-link library (DLL)."
                                  Roy Cline

                                  Comment


                                  • #18
                                    Just to complete the picture, "importing and exporting" variables can be easily acccomplished with the PB compilers using...
                                    Code:
                                    ' ===============================================================
                                    '  SUPPORTING FUNCTIONS (DLL)
                                    ' ===============================================================
                                    
                                    #COMPILE DLL "thedll.dll" 
                                    
                                     GLOBAL thevariable AS [required type]
                                    
                                    
                                    FUNCTION GetVariable ALIAS "whatever" () EXPORT AS [required type]
                                       FUNCTION = thevariable
                                    END FUNCTION
                                    
                                    ' ===============================================================
                                    '  USING PROGRAM (EXE)
                                    ' ===============================================================
                                    #COMPILE EXE 
                                    
                                    DECLARE FUNCTION VariableName LIB "TheDLL.DLL" ALIAS "whatever" AS [required type]
                                    
                                    ...
                                     FUNCTION whatever
                                    
                                         Z = 5 + VariableName 
                                      
                                         FOR W = 1 to VariableName 
                                    
                                         .....
                                    Of course, this assumes you control all the code and are not trying to tap into some third-party software.

                                    BTW, did anyone who seems to want this ever send in a new feature suggestion to add an option to the compiler for ...

                                    Code:
                                       GLOBAL     foo AS something 
                                       THREADED   bar  AS Something
                                       [b]EXPORT[/b]     baz  as Something   ' "NEW!"
                                    ???


                                    MCM
                                    Michael Mattias
                                    Tal Systems (retired)
                                    Port Washington WI USA
                                    [email protected]
                                    http://www.talsystems.com

                                    Comment


                                    • #19
                                      MCM wrote

                                      did anyone who seems to want this ever send in a new feature suggestion to add an option to the compiler for ...
                                      That was basically my plan if everything fell through with my little endeavor. However, at this point I feel a little less pressed to do so. If I can get something to work somehow/anyhow I'm usually happy.
                                      Fred
                                      "fharris"+Chr$(64)+"evenlink"+Chr$(46)+"com"

                                      Comment


                                      • #20
                                        Oops, I forgot the other half:
                                        Code:
                                        DECLARE EXTERNAL varname LIB "dllname.dll" ALIAS "whatever" as something
                                        MCM
                                        Michael Mattias
                                        Tal Systems (retired)
                                        Port Washington WI USA
                                        [email protected]
                                        http://www.talsystems.com

                                        Comment

                                        Working...
                                        X