易语言封装VBA函数到DLL,且能够被VBA调用

易语言封装VBA函数到DLL,且能够被VBA调用,第1张

查看dll

导出接口的签名是否符合需要

这个和平台有关,

选择不同的平台编译导出的接口是不同的

以上是专业的说法

通俗说就是dll导出接口的参数类型是否符合需要,

顺序是否符合需要

所谓平台就是编译时选择的和硬件相关的编译模式

可以将vba的函数和过程封装成ActiveX Dll 或 ActiveX 控件 封装之后要使用的话,如果是ActiveX Dll的话就需要先注册DLL再声明函数,和API函数一样,ActiveX 控件需要先注册再在部件里添加,并添加到窗体里,不需要声明 具体vb制作ActiveX 控件的

1、先用mfc向导生成静态dll文件

2、编辑增加类;

3、生成dll文件和lib文件;

4、将生成的dll和lib,和类的头文件复制到需要引用的文件exe下;

/

//导出dll的头文件myClassh

#define

DLLimport

__declspec(dllimport)

#define

DLLexprot

__declspec(dllexport)

class

DLLexprot

myClass

//导出类

{

public:

myClass(void);

~myClass(void);

void

fun1();

void

fun2();

};

//导出dll的cpp文件myClasscpp

#include

"StdAfxh"

#include

"myClassh"

myClass::myClass(void)

{

}

myClass::~myClass(void)

{

}

void

myClass::fun1()

{

::MessageBox(NULL,_T("fun1()"),_T("MessageBox"),MB_OKCANCEL);

}

void

myClass::fun2()

{

::MessageBox(NULL,_T("fun2()"),_T("MessageBox"),MB_OK);

}

//实现调用dll文件

hellocpp

#include

"myClassh"

//引用类的头文件

#pragma

comment(lib,"MFCdlllib")

//引用lib文件

#define

DLLimport

__declspec(dllimport)

#define

DLLexport

__declspec(dllexport)

class

DLLimport

myClass;

//导入类

#include

<iostream>

using

namespace

std;

int

main()

{

cout<<"hello

world!"<<endl;

myClass

a;

afun1();

//调用类的成员函数

afun2();

}望采纳。

你没有说是什么类型的dll,那么姑且就答一下咯。

首先呢,用VC++新建一个Win32 Dynamic-Link Library类型的工程,工程名就命名为fan吧。,并在AppWinzard的第一步选择“An empty dll project”选项,也就是创建一个空的动态链接库工程。然后,为该工程添加一个C++源文件(C源文件添加不了,因为没有C空文件的选项,不过我相信你可以把C代码改写成C++代码,要不然的话就无语了。。。):fanc,并在其中编写完成一个你的函数,比如我是完成一个加法运算函数和减法运算函数。结果代码如下:

int add(int a, int b)

{

reutnr a+b;

}

int subtract(int a, int b)

{

return a - b;

}

完成后用Bulid命令生成一个fan这个动态链接库程序了,然后在该工程的debug下你可以发现fandll的了。

有问题再给我message吧。。。

LS的是不是乱copy的呀,怎么无端端有一个kfc的可笑。

使用C#生成dll文件并调用

一、创建dll文件:

例如生成一个md5编码判断状态的文件,即,输入一个字符串(string A)和一个32位md5编码(string B),判断此字符串A对应的32位md5编码是否与B相等,如果相等返回true,否则返回false。

打开VS 2005,“文件”--》“新建”--“项目”,选择“Windows 控件库”,命名后点击“确定”,在“UserControl1cs”中输入以下代码:

using System;

using SystemCollectionsGeneric;

using SystemComponentModel;

using SystemDrawing;

using SystemData;

using SystemWindowsForms;

using SystemText;

using SystemSecurityCryptography;

namespace md5

{

public partial class Program : UserControl

{

#region MD5 32位加密:GetMd5Str32

/// <summary>

/// 32位MD5加密

/// </summary>

/// <param name="strSource">待加密字串</param>

/// <returns>加密后的字串</returns>

public static string GetMd5Str32(string strSource)

{

byte[] bytes = EncodingASCIIGetBytes(strSource);

byte[] hashValue = ((SystemSecurityCryptographyHashAlgorithm)SystemSecurityCryptographyCryptoConfigCreateFromName("MD5"))ComputeHash(bytes);

StringBuilder sb = new StringBuilder();

for (int i = 0; i < 16; i++)

{

sbAppend(hashValue[i]ToString("x2"));

}

return sbToString()ToUpper();

}

#endregion

#region 核对md5编码是否一致:CheckMd5String()

/// <summary>

/// 核对md5编码是否一致

/// </summary>

/// <param name="ConvertString"></param>

/// <returns>如果一致返回true,否则返回false</returns>

///

public static bool CheckMd5String(string str1, string str2)

{

string md5String = str1; //需要验证的字符串

string md5DbString = str2; //需要核对的32位md5编码

int result = stringCompare(md5ProgramGetMd5Str32(str1), md5DbString, true);

if (result == 0)

{

return true;

}

else

{

return false;

}

}

#endregion

}

}

修改“UserControl1Designercs”中的命名空间为“md5”,方法为“Program”,即可生成dll文件。

在\bin\Debug文件假下,可以找到相应的dll文件。

二、部署dll流程:

首先把dll文件放到应用程序\bin\Debug\下;

然后在解决方案中添加引用:右键鼠标-->添加引用-->浏览-->选择dll放置路径后点击“确定”。

注意:要在应用文件头处使用using md5;命令。

测试应用程序代码,如下:Form1cs

using System;

using SystemCollectionsGeneric;

using SystemComponentModel;

using SystemData;

using SystemDrawing;

using SystemText;

using SystemWindowsForms;

using md5;

namespace WindowsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

string str1 = textBox1TextToString();

string md5String = textBox2TextToString();

textBox3Text = md5ProgramGetMd5Str32(str1);

textBox4Text = md5ProgramCheckMd5String(str1, md5String)ToString();

}

private void button2_Click(object sender, EventArgs e)

{

thisClose();

}

}

}

三、注意点:

1、在C#应用程序开发过程中,加载dll文件时,报错“未能加载文件或程序集“md5, Version=2000, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。”,请指点一下是什么原因?

解决:这是因为加载dll的路径问题,正确加载方式为:在“解决方案”的“引用”文件上右击鼠标,选择“添加引用”---》在“浏览”选项卡中添加引用(注意:自己定义的dll文件不能在“NET”选项卡中添加。)

------------------------------------------------------------------------------------------------------------------

c#生成DLL文件,内部函数的问题

用C#编写一组处理XML文档的代码,由于要求生成DLL文件,并由外部的其他工具访问动态库中的文件,

但是用Dependency Walker检测我生成的这个DLL文件没有显示任何的函数,以前没做过这方面的东西,求教了

代码如下:

using System;

using SystemIO;

using SystemXml;

public class Sample

{

public static void Main()

{

DeleteArg();

}

static void DeleteArg()

{

XmlDocument doc = new XmlDocument();

docLoad(@"c:\\data1xml");

XmlNode root = docDocumentElement;

XmlNode Node1;

XmlNodeList nodeList = docSelectSingleNode("/Entity/Columns")ChildNodes;

foreach (XmlNode xn in nodeList)

{

XmlElement xe = (XmlElement)xn;

if (xeGetAttribute("Name") == "SysModuleID")

{

xeRemoveAll();

//xeRemoveAttribute("Name");//删除Name属性

}

}

docSave("c:\\data1xml");//保存这个文档到文件中

}

}

以上代码实现删除XML文件中某一节点的功能,如何在生成DLL后能够使用检测工具检测出DeleteArg函数,

使用Dependency Walker没检测出该函数是不是以为着这个动态库文件不能被调用

----

因为net的程序不是这样把函数放在导出表的, 我记得net做的dll只导出了一个_CorDllMain的方法,

所以用Dependency Walker是看不出来的 如果你想看net做的dll导出了什么内容,可以用反射查看元数据

----

生成这个DLL库文件,是想要别的工具运行这个动态库文件,实现DELETEARG()这个函数的功能

----

可以的

----

你上面的代码不是生成DLL的,而是一个控制台应用程序

要想创建动态库(DLL),在新建项目窗口中选择"类库", 默认的代码是这样的:

using System;

using SystemCollectionsGeneric;

using SystemText;

namespace ClassLibrary2

{

public class Class1

{

}

}

// 然后添加你的代码最后代码如下:

using System;

using SystemCollectionsGeneric;

using SystemText;

using SystemXml;

namespace ClassLibrary2

{

public class Class1

{

public void DeleteArg()

{

XmlDocument doc = new XmlDocument();

docLoad(@"c:\\data1xml");

XmlNode root = docDocumentElement;

XmlNode Node1;

XmlNodeList nodeList = docSelectSingleNode("/Entity/Columns")ChildNodes;

foreach (XmlNode xn in nodeList)

{

XmlElement xe = (XmlElement)xn;

if (xeGetAttribute("Name") == "SysModuleID")

{

xeRemoveAll();

//xeRemoveAttribute("Name");//删除Name属性

}

}

docSave("c:\\data1xml");//保存这个文档到文件中

}

}

}

最后编译一下就可以,

在Debug文件夹下回产生一个dll文件,最后在需要的工程里,将这个dll文件引进进去就可以用

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/12177544.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存