注册 登录
编程论坛 VC++/MFC

dll调用dll问题2

yalewang 发布于 2012-09-10 10:48, 1315 次点击
兄弟外行愚钝,前几天问了此类问题仍不得其解,也网上搜索了,自己比着复制、黏贴,总是编译通不过,望能详细赐教。

两个dll,都是win32编写的,
      dll1位于d:dll1目录下,dll2位于e:dll2目录下,
其中dll1输出in1(int x),out1()函数;
    dll2输出in2(int x),out2()函数;
希望:
  不改变目录位置全路径动态调用,dll2调用dll1;
  in2()的值传给in1(); out1的值out2();

帮我写一下好不好?谢谢
13 回复
#2
pangding2012-09-10 23:08
这……在这个区问不合适,我给你挪挪地方吧。
#3
眼底星空2012-09-11 11:03
    用函数指针吧。
   
    HINSTANCE hDll1 = NULL;
    HINSTANCE hDll2 = NULL;

    int (WINAPI * pIn1)(int) = NULL;
    int (WINAPI * pIn2)(int) = NULL;

    hDll1 = LoadLibrary("d:\\dll1\\dll1.dll");
    if(NULL == hDll1)
        return;

    hDll2 = LoadLibrary("d:\\dll2\\dll2.dll");
    if(NULL == hDll2)
        return;

    pIn1 = (int (WINAPI *)(int))GetProcAddress(hDll1,"in1");
    ASSERT(pIn1);

    pIn2 = (int (WINAPI *)(int))GetProcAddress(hDll2,"in2");
    ASSERT(pIn2);

    //如果要实现in2()的值传给in1(),可以如下写:
    int nVal = 3;
    int nRtn = pIn1(pIn2(nVal));

    //out1的值out2(),没懂楼主什么意思。

    FreeLibrary(hDll1);
    FreeLibrary(hDll2);



[ 本帖最后由 眼底星空 于 2012-9-11 11:08 编辑 ]
#4
yalewang2012-09-12 10:03
多谢回复,我是想用这个例子练习一下DLL调用DLL,不是APP调用,out1赋值给out2是想,两个dll各有两只手,互换手中的东西
#5
眼底星空2012-09-12 13:51
回复 4楼 yalewang
        还是不甚明白你的赋值是什么意思,out1函数没有参数也没有返回值。

        我的理解:你是想在dll1中调用dll2的in2函数? 又在dll2中调用dll1的out1函数?
        不知道是不是这意思。两个dll存在相互依赖,这种模块设计是不太合理的,一般很少见。

        不过我好像看过可以使编译通过的方法:
        先把dll1中调用dll2的部分屏蔽掉,编译出dll1;然后dll2链接dll1,编译出dll2;最后把dll1中代码恢复,链接dll2,重新再编译出dll1。
        这个我没有试过,你可以试一试。
#6
yalewang2012-09-15 13:55
谢谢,我试了好多次,编译通不过,希望能给个完整的CPP
我把问题调整一下这样叙述,可能好理解些

有三个DLL,DLL1 在 E:\DLL1 目录,DLL2在D:\DLL2, DLL3在D:\DLL3目录下,
 DLL2 和 DLL3 都调用 DLL1 ;

DLL1 输出函数 int in1(int x) 和 int out1(int x);

DLL2 输出函数 int in2(int x) 和 int out2(int x),
                         从DLL1输入函数in1()和out1() ;
DLL3 输出函数 int in3(int x) 和 int out3(int x),
                         从DLL1输入函数in1()和 out1() ;

DLL都是用win32写的
#7
寒风中的细雨2012-09-16 00:10
ding~~~
#8
yalewang2012-09-17 10:08
在win32 console 和MFC dll 中都调试出现这种错误,
error C2501: 'hinstance' : missing storage-class or type specifiers
#9
yalewang2012-09-17 11:39
我在等啊,谁帮一下?
#10
寒风中的细雨2012-09-17 12:42
还没解决吗
#11
眼底星空2012-09-17 12:46
试试include一下windows.h
方便的话把你代码贴出来看看吧
#12
寒风中的细雨2012-09-17 15:40
程序代码:
//dll_1.h
#ifdef __cplusplus
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif//__cplusplus

EXPORT int in_1(void);
EXPORT int out_1(void);

//
程序代码:
//dll_1.c
#include <Windows.h>
#include "dll_1.h"

int WINAPI DllMain(HINSTANCE hInstance,
                   DWORD fdwReason,
                   PVOID pvReserved)
{
    return TRUE;
}

EXPORT int in_1()
{
    return 1;
}

EXPORT int out_1()
{
    return 2;
}
//
程序代码:
//dll_2.h
#ifdef __cplusplus
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif//__cplusplus

EXPORT int in_2(void);
EXPORT int out_2(void);
//
程序代码:
//dll_2.c
#include <Windows.h>
#include "dll_2.h"

int WINAPI DllMain(HINSTANCE hInstance,
                   DWORD fdwReason,
                   PVOID pvReserved)
{
    return TRUE;
}

EXPORT int in_2()
{
    int i = 0;
    HMODULE h = NULL;
    int (*fun)(void);
    SetDllDirectory(TEXT("E:\\Project\\DLL1"));
    h = LoadLibrary(TEXT("dll_1"));
    if (h)
    {
        fun = (int (__cdecl *)(void)) GetProcAddress(h, "in_1");
        i = 2*fun();
        FreeLibrary(h);
    }

    return i;
}

EXPORT int out_2()
{
    int i = 0;
    HMODULE h = NULL;
    int (*fun)(void);
    SetDllDirectory(TEXT("E:\\Project\\DLL1\\dll_1"));
    h = LoadLibrary(TEXT("dll_1"));
    if (h)
    {
        fun = (int (__cdecl *)(void)) GetProcAddress(h, "out_1");
        i = 2*fun();
        FreeLibrary(h);
    }

    return i;
}
//
程序代码:
//dll_3.h
#ifdef __cplusplus
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif//__cplusplus

EXPORT int in_3(void);
EXPORT int out_3(void);
//
程序代码:
//dll_3.c
#include <Windows.h>
#include "dll_3.h"

int WINAPI DllMain(HINSTANCE hInstance,
                   DWORD fdwReason,
                   PVOID pvReserved)
{
    return TRUE;
}

EXPORT int in_3()
{
    int i = 0;
    HMODULE h = NULL;
    int (*fun)(void);
    SetDllDirectory(TEXT("E:\\Project\\DLL1\\dll_1"));
    h = LoadLibrary(TEXT("dll_1"));
    if (h)
    {
        fun = (int (__cdecl *)(void)) GetProcAddress(h, "in_1");
        i = 3*fun();
        FreeLibrary(h);
    }

    return i;
}

EXPORT int out_3()
{
    int i = 0;
    HMODULE h = NULL;
    int (*fun)(void);
    SetDllDirectory(TEXT("E:\\Project\\DLL1"));
    h = LoadLibrary(TEXT("dll_1"));
    if (h)
    {
        fun = (int (__cdecl *)(void)) GetProcAddress(h, "out_1");
        i = 3*fun();
        FreeLibrary(h);
    }

    return i;
}
//
程序代码:
//DLL_APP.c
#include <Windows.h>
#include <strsafe.h>

int WINAPI WinMain(HINSTANCE hInstace,
    HINSTANCE PrevhInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
{
    HMODULE hDll_1 = NULL, hDll_2 = NULL, hDll_3 = NULL;
    int (*fun)(void);
    TCHAR buff[128] = {0};

    hDll_1 = LoadLibrary(TEXT("E:\\Project\\DLL1\\dll_1"));
    hDll_2 = LoadLibrary(TEXT("E:\\Project\\DLL2\\dll_2"));
    hDll_3 = LoadLibrary(TEXT("E:\\Project\\DLL3\\dll_3"));

    if (!hDll_1 || !hDll_2 || !hDll_3)
    {
        MessageBox(NULL, TEXT("error..."), TEXT("msg"), 0);
        return -1;
    }

    fun = (int (*)(void))GetProcAddress(hDll_1, "in_1");
    StringCchPrintf(buff, _countof(buff), TEXT("int in_1(void) = %d\n"), fun());
    MessageBox(NULL, buff, TEXT("msg"), 0);
    fun = (int (*)(void))GetProcAddress(hDll_1, "out_1");
    StringCchPrintf(buff, _countof(buff), TEXT("int out_1(void) = %d\n\n"), fun());
    MessageBox(NULL, buff, TEXT("msg"), 0);

    fun = (int (*)(void))GetProcAddress(hDll_2, "in_2");
    StringCchPrintf(buff, _countof(buff), TEXT("int in_2(void) = %d\n"), fun());
    MessageBox(NULL, buff, TEXT("msg"), 0);
    fun = (int (*)(void))GetProcAddress(hDll_2, "out_2");
    StringCchPrintf(buff, _countof(buff), TEXT("int out_2(void) = %d\n\n"), fun());
    MessageBox(NULL, buff, TEXT("msg"), 0);

    fun = (int (*)(void))GetProcAddress(hDll_3, "in_3");
    StringCchPrintf(buff, _countof(buff), TEXT("int in_3(void) = %d\n"), fun());
    MessageBox(NULL, buff, TEXT("msg"), 0);
    fun = (int (*)(void))GetProcAddress(hDll_3, "out_3");
    StringCchPrintf(buff, _countof(buff), TEXT("int out_3(void) = %d\n\n"), fun());
    MessageBox(NULL, buff, TEXT("msg"), 0);

    FreeLibrary(hDll_1);
    FreeLibrary(hDll_2);
    FreeLibrary(hDll_3);

    return 0;
}












#13
yalewang2012-09-18 10:59
版主帮一下啊
#14
KBTyanhuo2012-09-27 11:12
你可以搜一下 __declspec(dllexport) 和 __declspec(dllimport) 的区别和使用

在 dll 中调用其他 dll 中的函数和变量以及类,需要用后者修饰
1