DLL在不同工程中的宏定义

qjgdftxmu 2016-05-27 10:25:14
有一个DLL,希望在被A调用的时候,有一种实现,被B调用的时候是另一种表现。

可以通过宏定义来实现么
...全文
220 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qjgdftxmu 2016-05-27
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
仅供参考:
#include <stdio.h>
void whocallme();
void fun1() {
    printf("in fun1\n");whocallme();
}
void fun2() {
    printf("in fun2\n");whocallme();
}
void fun3() {}
void whocallme() {
    int *_ebp;
    __asm {
        mov eax,ebp
        mov _ebp,eax
    }
#ifdef _DEBUG
    printf("\nfun1,fun2,fun3,_ebp=%08x,%08x,%08x,%08x\n",(int)fun1+5+*(int *)((int)fun1+1),(int)fun2+5+*(int *)((int)fun2+1),(int)fun3+5+*(int *)((int)fun3+1),(int)_ebp);
#else
    printf("\nfun1,fun2,fun3,_ebp=%08x,%08x,%08x,%08x\n",(int)fun1,(int)fun2,(int)fun3,(int)_ebp);
#endif
        printf("ret addr=%08x\n",_ebp[1]);
#ifdef _DEBUG
        if ((int)fun1+5+*(int *)((int)fun1+1)<=_ebp[1] && _ebp[1]<(int)fun2+5+*(int *)((int)fun2+1)) printf("fun1 callme\n");
        if ((int)fun2+5+*(int *)((int)fun2+1)<=_ebp[1] && _ebp[1]<(int)fun3+5+*(int *)((int)fun3+1)) printf("fun2 callme\n");
#else
        if ((int)fun1<=_ebp[1] && _ebp[1]<(int)fun2) printf("fun1 callme\n");
        if ((int)fun2<=_ebp[1] && _ebp[1]<(int)fun3) printf("fun2 callme\n");
#endif
}
int main() {
    fun2();
    fun1();
    return 0;
}
其实问题的不是宏定义了。 而是有一个DLL,希望在被A工程调用的时候和被B工程调用的时候表现不一样,本来可以通过传不同参数来实现,不过如果是宏定义的话速度会更快。 有些类似于跨平台,这个是跨工程。 不过仔细想想,应该很难,宏定义是编译期就已经决定了。除非对于A和B生成不同的版本。
赵4老师 2016-05-27
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
void whocallme();
void fun1() {
    printf("in fun1\n");whocallme();
}
void fun2() {
    printf("in fun2\n");whocallme();
}
void fun3() {}
void whocallme() {
    int *_ebp;
    __asm {
        mov eax,ebp
        mov _ebp,eax
    }
#ifdef _DEBUG
    printf("\nfun1,fun2,fun3,_ebp=%08x,%08x,%08x,%08x\n",(int)fun1+5+*(int *)((int)fun1+1),(int)fun2+5+*(int *)((int)fun2+1),(int)fun3+5+*(int *)((int)fun3+1),(int)_ebp);
#else
    printf("\nfun1,fun2,fun3,_ebp=%08x,%08x,%08x,%08x\n",(int)fun1,(int)fun2,(int)fun3,(int)_ebp);
#endif
        printf("ret addr=%08x\n",_ebp[1]);
#ifdef _DEBUG
        if ((int)fun1+5+*(int *)((int)fun1+1)<=_ebp[1] && _ebp[1]<(int)fun2+5+*(int *)((int)fun2+1)) printf("fun1 callme\n");
        if ((int)fun2+5+*(int *)((int)fun2+1)<=_ebp[1] && _ebp[1]<(int)fun3+5+*(int *)((int)fun3+1)) printf("fun2 callme\n");
#else
        if ((int)fun1<=_ebp[1] && _ebp[1]<(int)fun2) printf("fun1 callme\n");
        if ((int)fun2<=_ebp[1] && _ebp[1]<(int)fun3) printf("fun2 callme\n");
#endif
}
int main() {
    fun2();
    fun1();
    return 0;
}
qjgdftxmu 2016-05-27
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
你不能根据该接口的参数的不同才执行不同的行为吗?
主要是宏定义速度更快了,不用每次调用都去判断。
lx624909677 2016-05-27
  • 打赏
  • 举报
回复
DLL只是一些函数的载体,具体调用那个,可以在调用的时候指定,比如DLL里有A 和 B两个函数,那么程序a和b可以分别取调用A和B函数
Eleven 2016-05-27
  • 打赏
  • 举报
回复
你不能根据该接口的参数的不同才执行不同的行为吗?
爆豆 2016-05-27
  • 打赏
  • 举报
回复
从你的描述看,好像不是跨平台,是想在不同的载体上展示不同效果吧,用参数区别开就好
oyljerry 2016-05-27
  • 打赏
  • 举报
回复
你DLL提供的是接口函数,你这个应该是编译的时候,根据不同的需求,一份代码编译出两个不同的DLL,然后他们有不同的接口给A,B调用

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧