扩展dll和规则dll貌似没区别啊?

wzuxian2012 2013-04-08 09:11:02
别贴网上的资料

我看过很多遍了,也试验过。

感觉2者的区别(目前发现的只有这么一点)
扩展dll 的导出函数里不能够创建对话框,只要创建立即报错。

规则dll则可以。


另外:2者都可以导出mfc类的派生类,

网上说:扩展dll则可以,我试验了一下,发现规则dll也可以导出。

...全文
230 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-05-30
  • 打赏
  • 举报
回复
MFC 类的派生类或者组合类
lm_whales 2013-05-30
  • 打赏
  • 举报
回复
扩展dll导出C++ 类,并且是MFC(dll版)的扩展类(即导出某个动态库中的 MFC 类的派生类); 这种DLL是MFC类库(dll版)的扩展,所以称为扩展dll C 使用这种 DLL应该是很吃力的,除非你根本没有做什么扩展(没有导出某个MFC 类的派生类)。 规则DLL只是使用MFC类库(dll版或者静态库),导出函数是C形式的。
看不见的裂痕 2013-04-22
  • 打赏
  • 举报
回复
扩展DLL只能用在MFC里面,针对MFC生成的一些对话框程序。 其他C#和Java是没办法调用的。 规则DLL都是可以的。
wzuxian2012 2013-04-22
  • 打赏
  • 举报
回复
人呢? 人呢? 人呢?
看不见的裂痕 2013-04-22
  • 打赏
  • 举报
回复
我说带窗体的,你C语言调用带窗体的扩展DLL能成功? 你C语言最多调用extern “C”的非窗体化得DLL,那是可以的。
wzuxian2012 2013-04-22
  • 打赏
  • 举报
回复
引用 15 楼 tiger9991 的回复:
扩展DLL只能用在MFC里面,针对MFC生成的一些对话框程序。 其他C#和Java是没办法调用的。 规则DLL都是可以的。
你试验过了吗? 我做过实验,发现,c语言也可以调用啊,所以才来问人 如果你会c#那更好做实验了. 呵呵
linlinlinxi007 2013-04-10
  • 打赏
  • 举报
回复
规则MFC DLL,可以被各种语言调用,只要你的接口参数标准 扩展MFC DLL,需要MFC程序调用,这个是一个限制的地方 MFC的扩展DLL和MFC的常规(regular)DLL的区别在于:前者可以导出MFC类,而后者不能,只能导出自己写的C++类
  • 打赏
  • 举报
回复
引用 2 楼 wzuxian2012 的回复:
引用 1 楼 akirya 的回复:C可以调用规则dll,如果不能调用,那么就是扩展dll。 不是根据工程类型区分的。 你的这个,是不是太草率了, 我举个极端的例子来 推翻: 无论是规则的还是扩展的, 都可以提供 一般的函数吧。 比如这样的函数 int fun() { return 0; } 就这么简单的一个接口函数……
这有啥极端的,创建mfc的对话框需要一些初始化操作,不管在dll还是在exe中。 但在扩展dll中,都没做这些初始化操作,出错很正常。 除了 AfxSetResourceHandle 外,还需要一个CWinApp类型的theApp,当然还有其他操作。 具体参考 VC\atlmfc\src\mfc\dllmodul.cpp 这些操作你都做的话创建对话框自然没有问题。
wzuxian2012 2013-04-10
  • 打赏
  • 举报
回复
wzuxian2012 2013-04-10
  • 打赏
  • 举报
回复
引用 12 楼 akirya 的回复:
引用 11 楼 akirya 的回复:引用 10 楼 wzuxian2012 的回复:引用 9 楼 akirya 的回复:引用 8 楼 wzuxian2012 的回复:引用 1 楼 akirya 的回复:C可以调用规则dll,如果不能调用,那么就是扩展dll。 不是根据工程类型区分的。 C/C++ code?123456789101112131415161……
谁知道你里面用了啥。 可以提供一个demo让我区分吗? 邮箱: liulin2017@163.com 多谢
  • 打赏
  • 举报
回复
引用 11 楼 akirya 的回复:
引用 10 楼 wzuxian2012 的回复:引用 9 楼 akirya 的回复:引用 8 楼 wzuxian2012 的回复:引用 1 楼 akirya 的回复:C可以调用规则dll,如果不能调用,那么就是扩展dll。 不是根据工程类型区分的。 C/C++ code?1234567891011121314151617181920212223242526……
向导只是生成一部分固定代码的 ,你完全可以删掉自己写啊。 你提供的代码编译后 就只能看到一个C可以调用的函数。谁知道你里面用了啥。 C能调用就是标准的dll。不能调用就是扩展的。
  • 打赏
  • 举报
回复
引用 10 楼 wzuxian2012 的回复:
引用 9 楼 akirya 的回复:引用 8 楼 wzuxian2012 的回复:引用 1 楼 akirya 的回复:C可以调用规则dll,如果不能调用,那么就是扩展dll。 不是根据工程类型区分的。 C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738……
向导只是生成一部分固定代码的 ,你完全可以删掉自己写啊。 你提供的代码 C编译后 就只能看到一个C可以调用的函数。谁知道你里面用了啥。 C能调用就是标准的dll。不能调用就是扩展的。
wzuxian2012 2013-04-10
  • 打赏
  • 举报
回复
引用 9 楼 akirya 的回复:
引用 8 楼 wzuxian2012 的回复:引用 1 楼 akirya 的回复:C可以调用规则dll,如果不能调用,那么就是扩展dll。 不是根据工程类型区分的。 C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647……
那到底 根据什么区分? 我是用类向导区分的, 类向导 如果不准确,那么 还有什么可以区分呢?
  • 打赏
  • 举报
回复
引用 8 楼 wzuxian2012 的回复:
引用 1 楼 akirya 的回复:C可以调用规则dll,如果不能调用,那么就是扩展dll。 不是根据工程类型区分的。 C/C++ code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152扩展dll代码: exte……
你还没明白 "不是根据工程类型区分的" 的意思
wzuxian2012 2013-04-10
  • 打赏
  • 举报
回复
引用 1 楼 akirya 的回复:
C可以调用规则dll,如果不能调用,那么就是扩展dll。 不是根据工程类型区分的。
扩展dll代码:

extern "C" int fun();


extern "C" int fun()
{
	return 11110;
}

测试工程代码:

//main.c

#include<windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <Shlwapi.h>
#include <string.h>
#include <assert.h>



int main()
{
	HINSTANCE hInst=NULL;
	int testVal=-1;
	CHAR strModuleFileName[MAX_PATH]={0};
	CHAR strDllName[MAX_PATH]="test9.dll";
	CHAR strDllComName[MAX_PATH]={0};
	char* pstr=NULL;
	typedef int(* pFun)();
	pFun myfun;
	GetModuleFileName(GetModuleHandle(NULL),strModuleFileName,MAX_PATH);
	pstr=strrchr(strModuleFileName,'\\');
	assert(pstr);
	*pstr='\0';
	PathCombine(strDllComName,strModuleFileName,strDllName);
	hInst=LoadLibrary(strDllComName);
	if(!hInst)
	{
		printf("加载dll失败,错误码为:%d\r\n",GetLastError());
		return 0;
	}
	myfun=(pFun)GetProcAddress(hInst,"fun");
	testVal=myfun();
	printf("%d",testVal);
	return 0;
}


自己验证吧, 无论扩展还是规则dll,均可以调用。


wzuxian2012 2013-04-09
  • 打赏
  • 举报
回复
引用 3 楼 huangbeyond 的回复:
对于扩展dll,确实只要在接口函数里创建一个对话框,立即导致程序崩溃。 ----------------------------------------------- 这个问题,要使用AfxSetResourceHandle来解决。 详细的,参考MSDN。
你要自己试试,比如 一个函数创建一个模式对话框就行 用扩展dll 你试试把, 看崩溃不 你加或不加都崩溃。 不信的话,我等你消息。
huangbeyond 2013-04-08
  • 打赏
  • 举报
回复
对于扩展dll,确实只要在接口函数里创建一个对话框,立即导致程序崩溃。 ----------------------------------------------- 这个问题,要使用AfxSetResourceHandle来解决。 详细的,参考MSDN。
wzuxian2012 2013-04-08
  • 打赏
  • 举报
回复
引用 1 楼 akirya 的回复:
C可以调用规则dll,如果不能调用,那么就是扩展dll。 不是根据工程类型区分的。
你的这个,是不是太草率了, 我举个极端的例子来 推翻: 无论是规则的还是扩展的, 都可以提供 一般的函数吧。 比如这样的函数 int fun() { return 0; } 就这么简单的一个接口函数, 2种dll都可以 实现, exe都可以成功的调用。 我在主贴里的那个 创建对话框的例子,我是亲自测试过的。 对于扩展dll,确实只要在接口函数里创建一个对话框,立即导致程序崩溃。 还有没有其他答案?
  • 打赏
  • 举报
回复
C可以调用规则dll,如果不能调用,那么就是扩展dll。 不是根据工程类型区分的。

16,551

社区成员

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

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

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