A problem about call Dll

Discussion in 'C Programming' started by ÓÚÑó, Aug 21, 2008.

  1. ÓÚÑó

    ÓÚÑó Guest

    Hi all!
    I have a Dll like this:

    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>

    __declspec (dllexport) int Add (int n)
    {
    int x;

    x = 100 + n;

    return x;
    }

    And I use this to call the Dll:

    #include "windows.h"
    #include "stdio.h"

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int iCmdShow)
    {
    HINSTANCE hAdd;
    FARPROC Add;

    if(hAdd= LoadLibrary ("Add.dll"))
    {
    Add = GetProcAddress (hAdd, "Add");
    printf ("%i\n", Add(100));
    FreeLibrary (hAdd);
    }

    }

    After compiling,there is an error:too many arguments to function.

    Please tell me how can i correct my code. Thanks in advance!!
    ÓÚÑó, Aug 21, 2008
    #1
    1. Advertising

  2. ÓÚÑó

    Willem Guest

    ÓÚÑó wrote:
    ) Hi all!
    ) I have a Dll like this:
    )
    ) #include <windows.h>
    <snip>
    ) Please tell me how can i correct my code. Thanks in advance!!

    You'll have better luck asking in a newsgroup that deals with
    windows programming, such as comp.os.ms-windows.programmer.*


    SaSW, Willem
    --
    Disclaimer: I am in no way responsible for any of the statements
    made in the above text. For all I know I might be
    drugged or something..
    No I'm not paranoid. You all think I'm paranoid, don't you !
    #EOT
    Willem, Aug 21, 2008
    #2
    1. Advertising

  3. ÓÚÑó

    jacob navia Guest

    ÓÚÑó wrote:
    > Hi all!
    > I have a Dll like this:
    >
    > #include <windows.h>
    > #include <stdio.h>
    > #include <stdlib.h>
    >
    > __declspec (dllexport) int Add (int n)
    > {
    > int x;
    >
    > x = 100 + n;
    >
    > return x;
    > }
    >
    > And I use this to call the Dll:
    >
    > #include "windows.h"
    > #include "stdio.h"
    >
    > int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    > LPSTR lpCmdLine, int iCmdShow)
    > {
    > HINSTANCE hAdd;
    > FARPROC Add;
    >
    > if(hAdd= LoadLibrary ("Add.dll"))
    > {
    > Add = GetProcAddress (hAdd, "Add");
    > printf ("%i\n", Add(100));
    > FreeLibrary (hAdd);
    > }
    >
    > }
    >
    > After compiling,there is an error:too many arguments to function.
    >
    > Please tell me how can i correct my code. Thanks in advance!!
    >
    >


    Using the free compiler lcc-win I do not get any errors. I do
    get warnings about using FARPROC without a cast, and missing return
    value from WinMain, but there are no errors.

    Which compiler are you using?

    Using Microsoft C, I do not get any warning or errors at all.


    --
    jacob navia
    jacob at jacob point remcomp point fr
    logiciels/informatique
    http://www.cs.virginia.edu/~lcc-win32
    jacob navia, Aug 21, 2008
    #3
  4. ÓÚÑó

    Bartc Guest

    "ÓÚÑó" <> wrote in message
    news:g8j967$rq9$99.com...

    > #include "windows.h"
    > #include "stdio.h"
    >
    > int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    > LPSTR lpCmdLine, int iCmdShow)
    > {
    > HINSTANCE hAdd;
    > FARPROC Add;
    >
    > if(hAdd= LoadLibrary ("Add.dll"))
    > {
    > Add = GetProcAddress (hAdd, "Add");
    > printf ("%i\n", Add(100));
    > FreeLibrary (hAdd);
    > }
    >
    > }
    >
    > After compiling,there is an error:too many arguments to function.


    Which function, Add?

    I don't recognise the FARPROC and other types, but: you're calling Add()
    with an int parameter, yet you've declared Add to have no parameters
    (assuming FARPROC declares a function of some kind).

    Also you may want to check that Add actually contains a valid function
    address.

    --
    Bartc
    Bartc, Aug 21, 2008
    #4
  5. ÓÚÑó

    jacob navia Guest

    Bartc wrote:
    > I don't recognise the FARPROC and other types, but: you're calling Add()
    > with an int parameter, yet you've declared Add to have no parameters
    > (assuming FARPROC declares a function of some kind).
    >
    > Also you may want to check that Add actually contains a valid function
    > address.
    >


    Normally FARPROC is
    typedef int (CALLBACK *FARPROC)();

    where CALLBACK is just _stdcall.

    Now, in C, this is a prototype to a function pointer with
    an unknown number of parameters.

    In C++ however, the empty parameter list is just assumed
    (void), and that could explain the warning...


    --
    jacob navia
    jacob at jacob point remcomp point fr
    logiciels/informatique
    http://www.cs.virginia.edu/~lcc-win32
    jacob navia, Aug 21, 2008
    #5
  6. "��������������������������" wrote:
    > Hi all!
    > I have a Dll like this:


    Then you probably have an implementation problem, not a C problem. For
    those you need to ask in an implementation-specific newsgroup. You are
    lucky, since there a several specifically for windows programming.
    DLLs, in particular, are implementation details that have nothing at all
    to do with C.


    > #include <windows.h>

    ^^^^^^^^^^^
    Note that <windows,h> is no part of the C language. It is, however,
    part of the the Windows interface to that particular operating system.

    > #include <stdio.h>
    > #include <stdlib.h>


    > __declspec (dllexport) int Add (int n)

    ^^^^^^^^^^ ^^^^^^^^^
    And neither __declspec nor dllexport mean anything at all in C. They
    may be defined in the <windows.h> header, but we can;t see them.

    > {
    > int x;
    > x = 100 + n;
    > return x;
    > }


    The body of this function could be collapsed down to
    { return 100 + n; }
    The variable x serves no purpose at all.


    > And I use this to call the Dll:
    > #include "windows.h"

    ^^^^^^^^^^
    > #include "stdio.h"

    ^^^^^^^
    Unless you have your own personal copies of <windows.h> and <stdio.h>
    that differ from the implementation-provided ones, and you mean to use
    those instead of the implementation-provided headers, the "..." form is
    almost always wrong.

    >
    > int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    > LPSTR lpCmdLine, int iCmdShow)


    And look at all the things in that one line that have no meaning in C
    without provided definitions, which you have not shown us. Those
    include WINAPI, WinMain, HINSTANCE, and LPSTR. Note that all C programs
    have a main() function in a hosted environment. You do not have one,
    but are using WinMain(). You are using a C-like language designed for
    use only in one particular environment. Newsgroups for that environment
    abound.

    > {
    > HINSTANCE hAdd;
    > FARPROC Add;


    FARPROC doesn't mean anything either.

    >
    > if(hAdd= LoadLibrary ("Add.dll"))
    > {
    > Add = GetProcAddress (hAdd, "Add");
    > printf ("%i\n", Add(100));
    > FreeLibrary (hAdd);
    > }
    >
    > }
    >
    > After compiling,there is an error:too many arguments to function.


    When you ask this in the right place, be sure to tell them the actual
    error message. You seem to have at least the functions LoadLibrary,
    GetProcAddess, printf, and FreeLibrary, only one of those, printf, has a
    defined meaning in C. You need to determine _which_ function has too
    many arguments. You should then look up those functions in your
    documentation. The only defined C function does not have the wrong
    number of arguments, so it must be one of those implementation-provided
    functions, so look in your implementation documentation. No C reference
    can help you.
    Martin Ambuhl, Aug 21, 2008
    #6
  7. ÓÚÑó

    Bartc Guest

    "Martin Ambuhl" <> wrote in message
    news:g8jfhv$h7t$...
    > "��������������������������" wrote:


    >> {
    >> int x;
    >> x = 100 + n;
    >> return x;
    >> }

    >
    > The body of this function could be collapsed down to
    > { return 100 + n; }
    > The variable x serves no purpose at all.


    For that matter, the function serves little purpose either; just adding 100
    to the argument would be better.

    And the entire program can be further collapsed into:

    #include <stdio.h>
    int main(void) {
    puts("200");
    }

    Which also eliminates the OP's problem :)

    --
    Bartc
    Bartc, Aug 21, 2008
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Anushi
    Replies:
    5
    Views:
    8,710
  2. pcarr01
    Replies:
    3
    Views:
    662
    Gordon Beaton
    Feb 17, 2005
  3. Tom
    Replies:
    1
    Views:
    456
  4. Utada P.W. SIU

    Asp call dll problem

    Utada P.W. SIU, May 23, 2005, in forum: ASP General
    Replies:
    3
    Views:
    258
    AlanM
    Aug 17, 2005
  5. H. Simpson
    Replies:
    4
    Views:
    261
    H. Simpson
    Aug 3, 2004
Loading...

Share This Page