① C中如何調用DLL
dll代碼:
#include <windows.h>
extern "C"
void _declspec( dllexport )
Msg()
{
MessageBox(NULL,"hello world!","demo",MB_OK);
}
編譯完成後把dll命名為fuck.dll ,放到 c盤下。
調用dll的exe的代碼:
#include <windows.h>
int main()
{
HMODULE hdll=LoadLibrary("c:\\fuck.dll"); //載入dll
if(hdll!=NULL)
{
FARPROC proc=GetProcAddress(hdll,"Msg");
if(proc!=NULL)
{
//proc();
_asm call proc
}
}
return 0;
}
② C# 中如何調用DLL文件
C# 中如何調用DLL文件的方法是:
有命名空間則引入命名空間,dll裡面,是a命名空間,有一個b類,然後有一個無參數靜態方法c
那麼調用方法就是a.b.c()。
然後是非託管dll
需要添加dll的名稱,以及方法,也就是你所用到的dll的每個方法都需要添加一次,
[DllImport("msvcrt.dll")]
public static extern int puts(string c);
③ c語言怎麼調用dll文件我有一個dll文件,叫「rock.dll」。然後裡面有一個函數(不知道是
typedef int(*GetHDiskCode_t)(xxxxxxx);
HMODULE hdll;
GetHDiskCode_t proc;
int main(){xxxxx;
hdll=LoadLibrary("rock.dll);
proc=(GetHDiskCode_t)GetProcAddress(hdll,"GetHDiskCode");
myhdid=(*proc)(xxxxxxxxx);
}
④ C+的dll如何用易語言正確調用
在編寫程序的時候往往需要調用到別的語言編寫的DLL文件,下面先來看一下在易語言中如何調用VC編寫的DLL呢,首先用VC編寫一個簡單的DLL文件,代碼如下:
int WINAPI add(int x,int y)
{
return x+y;
}
這是一虧嫌個簡單的兩個數加法操作,返回兩個數相加的結果,這里我生成的是MFC DLL,並且需要在def中導出add函數。
下面用易語言來調用它,首先在易語言中需要插入一個DLL命令,代碼如下:
.版本 2
.DLL命令 調用CDLL, 整數型, "cdll.dll", "add"
.參數 x, 整數型
.參數 y, 整數型
並且保存工程文件與DLL文件在一起,否則可能會報找不到DLL的錯誤.下面在按鈕中添加如下代碼:
.版本 2
.子程序 _按鈕1_被單擊
信息框 (調用CDLL (5, 5), 0, )
這樣我們傳遞了兩個數後就可以返回結果了,如下圖:
上圖的信息框顯示返回的結果是10,那麼這就是正確的了,易語言調用VC的DLL需要注意類型,並且DLL函數需要WINAPI或stdcall,否則也會報錯。
下面我們再來看一下VC如何調用易語言的DLL,還是先用易語言編寫一個DLL文件,建立一個DLL動態鏈接庫工程,新建一個子程序,代碼如下:
.版本 2
.子程序 add, 整數型, 公開
.參數 x, 整數型
.參數 y, 整數搏悉型
返回 (x + y)
下面我們用VC來調用這個DLL並且返回結果,代碼如下:
HINSTANCE hMod = LoadLibrary("e.dll");
typedef int(WINAPI *ADD)(int,int);
ADD myadd = (ADD)GetProcAddress(hMod,"add");
CString str;
str.Format("%d",myadd(5,5));
MessageBox(str);
FreeLibrary(hMod);
調用後結果如下圖:
這樣就得到了正確的結果了,需要注意的是易語言子程序必須公開,公開也銷銀手就是與VC中def文件導出是一樣的道理。
⑤ c語言怎麼調用dll文件
1、新建DLLTest文件夾,在該文件夾中新建source文件夾。
注意事項:
C語言能以簡易的方式編譯、處理低級存儲器。C語言是僅產生少量的機器語言以及不需要任何運行環境支持便能運行的高效率程序設計語言。
⑥ C#調用DLL中 DllImport 屬性詳解
DLL Import 屬性
現在是更深入地進行探討的時候了。在對託管代碼進行 P/Invoke 調用時,DllImportAttribute 類型扮演著重要的角色。DllImportAttribute 的主要作用是給 CLR 指示哪個 DLL 導出您想要調用的函數。相關 DLL 的名稱被作為一個構造函數參數傳遞給 DllImportAttribute。
如果您無法肯定哪個 DLL 定義了您要使用的 Windows API 函數,Platform SDK 文檔將為您提供最好的幫助資源。在 Windows API 函數主題文字臨近結尾的位置,SDK 文檔指定了 C 應用程序要使用該函數必須鏈接的 .lib 文件。在幾乎所有的情況下,該 .lib 文件具有與定義該函數的系橘碼統 DLL 文件相同的名稱。例如褲世,如果該函數需要 C 應用程序鏈接到 Kernel32.lib,則該函數就定義在 Kernel32.dll 中。您可以在 MessageBeep 中找到有關 MessageBeep 的 Platform SDK 文檔主題。在該主題結尾處,您會注意到它指出庫文件是 User32.lib;這表明 MessageBeep 是從 User32.dll 中導出的。
可選的 DllImportAttribute 屬性
除了指出宿主 DLL 外,DllImportAttribute 還包含了一些可選屬性,其中四個特別有趣:EntryPoint、CharSet、SetLastError 和 CallingConvention。
EntryPoint 在不希望外部託管方法具有與 DLL 導出相同的名稱的情況下,可胡伍肢以設置該屬性來指示導出的 DLL 函數的入口點名稱。當您定義兩個調用相同非託管函數的外部方法時,這特別有用。另外,在 Windows 中還可以通過它們的序號值綁定到導出的 DLL 函數。如果您需要這樣做,則諸如「#1」或「#129」的 EntryPoint 值指示 DLL 中非託管函數的序號值而不是函數名。
CharSet 對於字元集,並非所有版本的 Windows 都是同樣創建的。Windows 9x 系列產品缺少重要的 Unicode 支持,而 Windows NT 和 Windows CE 系列則一開始就使用 Unicode。在這些操作系統上運行的 CLR 將Unicode 用於 String 和 Char 數據的內部表示。但也不必擔心 — 當調用 Windows 9x API 函數時,CLR 會自動進行必要的轉換,將其從 Unicode轉換為 ANSI。
如果 DLL 函數不以任何方式處理文本,則可以忽略 DllImportAttribute 的 CharSet 屬性。然而,當 Char 或 String 數據是等式的一部分時,應該將 CharSet 屬性設置為 CharSet.Auto。這樣可以使 CLR 根據宿主 OS 使用適當的字元集。如果沒有顯式地設置 CharSet 屬性,則其默認值為 CharSet.Ansi。這個默認值是有缺點的,因為對於在 Windows 2000、Windows XP 和 Windows NT® 上進行的 interop 調用,它會消極地影響文本參數封送處理的性能。
應該顯式地選擇 CharSet.Ansi 或 CharSet.Unicode 的 CharSet 值而不是使用 CharSet.Auto 的唯一情況是:您顯式地指定了一個導出函數,而該函數特定於這兩種 Win32 OS 中的某一種。ReadDirectoryChangesW API 函數就是這樣的一個例子,它只存在於基於 Windows NT 的操作系統中,並且只支持 Unicode;在這種情況下,您應該顯式地使用 CharSet.Unicode。
有時,Windows API 是否有字元集關系並不明顯。一種決不會有錯的確認方法是在 Platform SDK 中檢查該函數的 C 語言頭文件。(如果您無法肯定要看哪個頭文件,則可以查看 Platform SDK 文檔中列出的每個 API 函數的頭文件。)如果您發現該 API 函數確實定義為一個映射到以 A 或 W 結尾的函數名的宏,則字元集與您嘗試調用的函數有關系。Windows API 函數的一個例子是在 WinUser.h 中聲明的 GetMessage API,您也許會驚訝地發現它有 A 和 W 兩種版本。
SetLastError 錯誤處理非常重要,但在編程時經常被遺忘。當您進行 P/Invoke 調用時,也會面臨其他的挑戰 — 處理託管代碼中 Windows API 錯誤處理和異常之間的區別。我可以給您一點建議。
如果您正在使用 P/Invoke 調用 Windows API 函數,而對於該函數,您使用 GetLastError 來查找擴展的錯誤信息,則應該在外部方法的 DllImportAttribute 中將 SetLastError 屬性設置為 true。這適用於大多數外部方法。
這會導致 CLR 在每次調用外部方法之後緩存由 API 函數設置的錯誤。然後,在包裝方法中,可以通過調用類庫的 System.Runtime.InteropServices.Marshal 類型中定義的 Marshal.GetLastWin32Error 方法來獲取緩存的錯誤值。我的建議是檢查這些期望來自 API 函數的錯誤值,並為這些值引發一個可感知的異常。對於其他所有失敗情況(包括根本就沒意料到的失敗情況),則引發在 System.ComponentModel 命名空間中定義的 Win32Exception,並將 Marshal.GetLastWin32Error 返回的值傳遞給它。如果您回頭看一下圖 1 中的代碼,您會看到我在 extern MessageBeep 方法的公共包裝中就採用了這種方法。
CallingConvention 我將在此介紹的最後也可能是最不重要的一個 DllImportAttribute 屬性是 CallingConvention。通過此屬性,可以給 CLR 指示應該將哪種函數調用約定用於堆棧中的參數。CallingConvention.Winapi 的默認值是最好的選擇,它在大多數情況下都可行。然而,如果該調用不起作用,則可以檢查 Platform SDK 中的聲明頭文件,看看您調用的 API 函數是否是一個不符合調用約定標準的異常 API。
通常,本機函數(例如 Windows API 函數或 C- 運行時 DLL 函數)的調用約定描述了如何將參數推入線程堆棧或從線程堆棧中清除。大多數 Windows API 函數都是首先將函數的最後一個參數推入堆棧,然後由被調用的函數負責清理該堆棧。相反,許多 C-運行時 DLL 函數都被定義為按照方法參數在方法簽名中出現的順序將其推入堆棧,將堆棧清理工作交給調用者。
幸運的是,要讓 P/Invoke 調用工作只需要讓外圍設備理解調用約定即可。通常,從默認值 CallingConvention.Winapi 開始是最好的選擇。然後,在 C 運行時 DLL 函數和少數函數中,可能需要將約定更改為 CallingConvention.Cdecl。
⑦ c語言怎麼調用dll文件
由於c的sdk編程的時候調用的api也應該是從dll中導出來的,這樣c應該也是內能調用dll的,c語言調用dll文件容內部函數的方法如下:
1:用c調用一個載入器LOADER<可能是個api函數>;
2:載入目標dll,比如xx.dll
3:找到需要調用的函數的地址P_FUNC
4:調用FUNC即可
⑧ 在C語言中怎樣調用*dll文件,該怎麼處理
生成動態庫文件後,那麼debug目錄下會同時又.lib和.dll文件。
而你的程序中只需加入#pragma comment(lib, "xxxx.lib")就可以調用。這個回是微軟的答調用方法。在linux下是.so文件;要設置環境變數。話說看書了解下更快。
⑨ C程序如何調用dll 文件
用的來IDE不一樣,生成DLL文件源的方法也有差異,建議上網查找你所用的IDE生成DLL文件的方法。
***********************************************
這個關鍵是IDE(比如是VC++還是BCB),C語言在編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」選項卡中添加。)