Ⅰ C#引用c语言dll错误
先试试修改 ANSI / Unicode
__stdcall / ccall
强行指定为 x86 或者 x64
没做过CE的,在win上遇到过这些问题
Ⅱ C语言如何调用DLL
//dll
#include<windows.h>
extern"C"//保持C语言文件
void_declspec(dllexport)tryProc()//定义函数
{
MessageBox(NULL,_T("a"),_T("a"),MB_OK);
}
-------------------------------------
//C
#include<windows.h>
intmain()
{
HMOUDLEdll=LoadLibrary(/*DLL文件名*/);
if(dll!=NULL)
{
FARPROCtry=GetProcAddress(dll,"tryProc");
if(try!=NULL)
{
tryProc();//假如函数有返回值,可以用try()得到返回值
/*_asmcalltryProc*/
}
}
return0;
}
Ⅲ C语言的dll怎么调用C++的DLL 各位大虾请帮忙哈。
首先你的动态链接库和你编译后生成的可执行程序要在同一个文件夹里,不然有可能找不到你的DLL
另外,int __declspec(dllexport) _stdcall ConnectDatabase(char* lable, char* price, char* desc)
这儿要把 _stdcall 去掉,因为按照 stdcall调用约定 ,编译后的DLL里函数名会发生变化,发生变化后的函数名为 _函数名@参数长度,在你这儿编译后的函数名就变成了 _ConnectDatabase@12,这样你用GetProcAddress时就查找不到函数 ,去掉后按照cdecl的调用约定,同C的默认调用约定相同,函数名不会发生变化,这样就不会发生找不到函数的情况,就可以执行成功。
还一个错误地方:sprintf(funre, "返回:%s",funreturn); ,这儿funreturn是int型的,用%s会出现异常的,要改成%d
希望对你有所帮助,如果有其他疑问可以站内信联系。
Ⅳ C语言 引用DLL 调用DLL
首先如果有.lib文件的话,直接在最开始加一句 #pragma comment(lib,"1.lib")然后声明一下Msgbox函数比如你的Msgbox函数是 int Msgbox(char * str1,char *str2);那么你应该 _declspec(dllimport) int Msgbox(char *str1,char *str2);然后你在函数中就可以直接用Msgbox函数了 第二种是动态加载dll 直接在要用的地方HINSTANCE hinst=LoadLibrary("1.dll");typedef int (*p)(char*,char*);//这个是定义一个函数指针然后用p pfun=(p)GetProcAddress(hinst,"Msgbox");然后就可以调用了
Ⅳ C语言调用C++写的DLL
1为了使c能调用c++写的dll。c++中使用extern "C"{ }修饰该接口即可
这个原因你应该知道吧大概意思是告诉c++编译器这段代码用c编译器编译
编译之后的结果是c方式的而不是c++方式的。
2但是c中不识别extern "C"。
综上两点,在dll头文件中常这样写,如下:
意思就是编译的时候编译成c方式。但是包含头文件时,因为是c调用所以会忽略掉extern "C"
#ifdef __cplusplus
extern "C"
{
#endif
。。。。。。。。。。。。
#ifdef __cplusplus
}
#endif
这个你也明白吧。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
Ⅵ c语言怎么调用dll文件
(1)编写程序时,你要包含(#include "什么.h") dll文件作者提供 的 头文件(.h文件) 。
程序里,便和普通函数调用一样,去调用它的函数。
(2)程序编译时,你要链接 dll文件作者提供 的 (.lib文件) 库文件。
当然,你可以在源程序里把.lib 名字 写上,编译时自动去链接,例子:
#pragma comment (lib, "什么.lib")
(3)执行时,要有 .dll 文件. 放在当前文件夹或系统文件夹里。
Ⅶ c语言怎么调用dll文件
1、新建DLLTest文件夹,在该文件夹中新建source文件夹。
注意事项:
C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。
Ⅷ c语言如何调用dll动态链接库
这是我以前的回答,是个两数加法的例子,看了就明白了
你的dll不必用h头文件,你用的是显式声明导出函数
vc在显式声明函数时会出现与vb不匹配的问题,他会把函数名改了,你必须用隐式声明,就是def文件声明才可以。
你的cpp里直接写
int __stdcall add(int a, int b)
{
return (a+b);
}
然后再在工程里添加一个文本文件,注意,文件名是 makedll(如果不对就是工程名).def
里面写
LIBRARY makedll
EXPORTS
add @1
然后保存
编译、连接
得到的dll就是vb可以调用的了
vb里呢,不用怎么改
如下
Public Declare Function add Lib "makedll.dll" (ByVal a As Integer,ByVal b As Integer) As Integer
Private Sub Command1_Click()
Dim c As Integer
c = add(1, 2)
MsgBox c
End Sub
这有就应该没问题了
Ⅸ 如何在C语言中调用C++编写的DLL中的函数
C语言没办法直接调用C++库
要调用C++的库
必须加一层封装
即
先写一个C++文件,
对每个要调用的C++DLL中的函数func_name,
封装成
extern
"C"
{
return_type
func_name_C(list)
{
return
func_name(list);
}
}
这样的形式。
然后
把这个c++文件,
封装成dll
C文件调用这个dll里面的函数,
间接调用原始DLL
Ⅹ C#中怎样引用c编写的dll
使用C#生成dll文件并调用
一、创建dll文件:
例如生成一个md5编码判断状态的文件,即,输入一个字符串(string A)和一个32位md5编码(string B),判断此字符串A对应的32位md5编码是否与B相等,如果相等返回true,否则返回false。
打开VS 2005,“文件”--》“新建”--“项目”,选择“Windows 控件库”,命名后点击“确定”,在“UserControl1.cs”中输入以下代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Text;
using System.Security.Cryptography;
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 = Encoding.ASCII.GetBytes(strSource);
byte[] hashValue = ((System.Security.Cryptography.HashAlgorithm)System.Security.Cryptography.CryptoConfig.CreateFromName("MD5")).ComputeHash(bytes);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 16; i++)
{
sb.Append(hashValue[i].ToString("x2"));
}
return sb.ToString().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 = string.Compare(md5.Program.GetMd5Str32(str1), md5DbString, true);
if (result == 0)
{
return true;
}
else
{
return false;
}
}
#endregion
}
}
修改“UserControl1.Designer.cs”中的命名空间为“md5”,方法为“Program”,即可生成dll文件。
在...\bin\Debug文件假下,可以找到相应的dll文件。
二、部署dll流程:
首先把dll文件放到应用程序...\bin\Debug\下;
然后在解决方案中添加引用:右键鼠标-->添加引用-->浏览-->选择dll放置路径后点击“确定”。
注意:要在应用文件头处使用using md5;命令。
测试应用程序代码,如下:Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using md5;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string str1 = textBox1.Text.ToString();
string md5String = textBox2.Text.ToString();
textBox3.Text = md5.Program.GetMd5Str32(str1);
textBox4.Text = md5.Program.CheckMd5String(str1, md5String).ToString();
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
三、注意点:
1、在C#应用程序开发过程中,加载dll文件时,报错“未能加载文件或程序集“md5, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。”,请指点一下是什么原因?
解决:这是因为加载dll的路径问题,正确加载方式为:在“解决方案”的“引用”文件上右击鼠标,选择“添加引用”---》在“浏览”选项卡中添加引用(注意:自己定义的dll文件不能在“.NET”选项卡中添加。)
------------------------------------------------------------------------------------------------------------------
c#生成DLL文件,内部函数的问题
用C#编写一组处理XML文档的代码,由于要求生成DLL文件,并由外部的其他工具访问动态库中的文件,
但是用Dependency Walker检测我生成的这个DLL文件没有显示任何的函数,以前没做过这方面的东西,求教了
代码如下:
using System;
using System.IO;
using System.Xml;
public class Sample
{
public static void Main()
{
DeleteArg();
}
static void DeleteArg()
{
XmlDocument doc = new XmlDocument();
doc.Load(@"c:\\data1.xml");
XmlNode root = doc.DocumentElement;
XmlNode Node1;
XmlNodeList nodeList = doc.SelectSingleNode("/Entity/Columns").ChildNodes;
foreach (XmlNode xn in nodeList)
{
XmlElement xe = (XmlElement)xn;
if (xe.GetAttribute("Name") == "SysMoleID")
{
xe.RemoveAll();
//xe.RemoveAttribute("Name");//删除Name属性
}
}
doc.Save("c:\\data1.xml");//保存这个文档到文件中
}
}
以上代码实现删除XML文件中某一节点的功能,如何在生成DLL后能够使用检测工具检测出DeleteArg函数,
使用Dependency Walker没检测出该函数是不是以为着这个动态库文件不能被调用.
----
因为.net的程序不是这样把函数放在导出表的, 我记得.net做的dll只导出了一个_CorDllMain的方法,
所以用Dependency Walker是看不出来的. 如果你想看.net做的dll导出了什么内容,可以用反射查看元数据
----
生成这个DLL库文件,是想要别的工具运行这个动态库文件,实现DELETEARG()这个函数的功能
----
可以的
----
你上面的代码不是生成DLL的,而是一个控制台应用程序.
要想创建动态库(DLL),在新建项目窗口中选择"类库", 默认的代码是这样的:
using System;
using System.Collections.Generic;
using System.Text;
namespace ClassLibrary2
{
public class Class1
{
}
}
// 然后添加你的代码.最后代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace ClassLibrary2
{
public class Class1
{
public void DeleteArg()
{
XmlDocument doc = new XmlDocument();
doc.Load(@"c:\\data1.xml");
XmlNode root = doc.DocumentElement;
XmlNode Node1;
XmlNodeList nodeList = doc.SelectSingleNode("/Entity/Columns").ChildNodes;
foreach (XmlNode xn in nodeList)
{
XmlElement xe = (XmlElement)xn;
if (xe.GetAttribute("Name") == "SysMoleID")
{
xe.RemoveAll();
//xe.RemoveAttribute("Name");//删除Name属性
}
}
doc.Save("c:\\data1.xml");//保存这个文档到文件中
}
}
}
最后编译一下就可以,
在Debug文件夹下回产生一个dll文件,最后在需要的工程里,将这个dll文件引进进去就可以用.