Ⅰ 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文件引進進去就可以用.