C_and_CPP 板


LINE

※ 引述《fej》之铭言: : (5)选build-->build 123.dll 然後在debug目录下就有123.dll 及 123.lib : (6)然後再开一个新专案 file -->new -->project中的win32 console application : 叫user的专案 : (7)开一header file 叫"user.h",且把之前的123.dll 及 123.lib复制 贴在此专案里 : 然後选把'123.lib' add to project : (8)以下是我的user.h内容..只有一句 : int __declspec(dllexport) __stdcall VCType_Count(int m, int n); Hi, 在建 dll 时你的 user.h 应该是 dllimport. 在使用 dll 时你的 user.h 应该要写 dllexport. 下面是我以前写过一些整理的 dll 的写法, 参考看看吧, 不一定是唯一建 dll 的方法, 这只是我的经验 XD ---------------------------------------------------------------------------- 写 DLL 时可以分成下列二种 : 1. 纯写 C/C++(WIN32) 资料处理,没有用到 MFC 的任何东西时, 利用下列语法来描述要输出函式和类别 : 建 Dll 别忘了要加入前置定义 BUILDINGDLL #ifndef BUILDINGDLL #define MYDLLAPI __declspec(dllimport) #else #define MYDLLAPI __declspec(dllexport) #endif MYDLLAPI int export_g_value; MYDLLAPI int export_function_name( int args, ... ); class MYDLLAPI class_name { }; 利用这个语法,做出来的 dll 比较有弹性,在别的编译器编译, 就可以过关,而不限只在 VC。 在写这种 dll,若要提供给纯 C 使用时,必须要加上下列语法 : extern "C" { int function(); class Person { ... }; } 因为 C 的 dll 函式编码各家编译器都统一,所以做出来的 Dll 可以共用,但是 C++ 的 dll 函式编码没有统一,所以做出来的 Dll 就不可以共用了,因此为了共用必须使用上述 extern "C" 语法包起来。 2. Dll 里内建资源,例如包含了一个对话盒等等,即有用到 MFC 时, 在这种情况下,若选择 win32/Dll 专案,则对话盒会显示不出来, 我们必须要选择 MFC Dll,共分成三种,其中 Regular Dll 是用来 提供给非 VC 的程式让它们也可以使用此 Dll,例如 VB 等等, 若只给 VC 程式用,则选择 Extension DLL,此时利用下列语法来 描述要输出的函式和类别 : 在 MFC Dll 里,除了可以利用上述的 纯 C/C++(WIN32) 写法 来描述外, MFC dll 还提供另一种较方便的写法,在输出变数 、函式、类别都一样,只要加 AFX_EXT_CLASS 即可,要注意的 是用 MFC Dll 时,前置定义会多个 _AFXEXT ,不能砍掉,这 是给 AFX_EXT_CLASS 用的,相当於上述的 BUILDINGDLL ex : extern AFX_EXT_CLASS int export_g_value; AFX_EXT_CLASS int export_function(); class AFX_EXT_CLASS CStudent : public CObject { // class interface declare.. }; 如何在 Exe 专案里 link dll ? 有二种方式 : 1. Delayed Load : 在这种方式下,比较有弹性,即使没有 dll 程式还是可以执行, dll 视须要时才被程式载入使用,使用方式如下 : // 载入某个 dll LoadLibrary("xxx.dll"); // 输出某个 function GetProcAddress("function_name"); // ... 使用它 // 释於该 dll FreeLibrary("xxx.dll"); 只要这三个函式即可使用 dll。 2. 直接 link 在程式里 : 在这种方式下,程式一开始就要找到 xxx.dll,不然就无法执行, 使用时较 delayed load 没弹性,但写程式时不用 GetProcAddress 去取得要用函式的名称,省去很多麻烦,可以直接呼叫 dll 所给 的标头档里的输出函式来用。 不管使用哪一种方式,都必须要将 dll 输出函式的那个标头档加入到 执行档的专案下,用 AddFile 加入即可,不用复制一份过来,而在专 案里 include 时如下 : #include "..\MyDll\MyDll.h" 输入相对位置即可,而在执行档专案设定里,须要在 linker-> Additional Dependencies 填入 xxxxx.lib (视该 lib 位置填入相对位置即可) linker->Advanced 填入 xxxxx.dll (视该 dll 位置填入相对位置即可) 降子就不会有 link 上的错误发生了。 做出来的执行档必须要找得到 xxxxx.dll 才能正确的执行,通常将该 dll 放在和执行档一样的位置。 ------------------------------------------------------------------------- Good Luck! --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.116.246.54
1F:→ babyghost:写错,建时应该用dllexport, 用时应该用dllimport XD 03/23 20:31







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP