『壹』 如何將圖片封裝成.dll文件及調用~!
VB
代碼
最簡單的方法:
創建
ActiveX
Dll
然後裡面添加個窗體Form1,窗體上添加圖片框
Image1
如果多圖
用個Imagelist
類模塊
內寫個公共調用函數
多圖片的根據ID獲取對應的圖片就是了。這里就添加一個
Image1
然後為Image1選擇個圖片
dll
的類模塊
Class1
中寫如下代碼
Public
Function
GetYouPic()
As
StdPicture
Set
GetYouPic
=
Form1.Image1.Picture
End
Function
Dll
就這么好了
嘎嘎
,
編譯生成Dll
(MyDll測試生成的Dll名字)
調用:
創建個exe工程文件
然後菜單中
工程\引用剛才的dll
-MyDll.dll
然後在exe工程中添加個Image1
顯示Dll中圖片的代碼
Private
Sub
Form_Load()
'窗體載入代碼寫
這個就可以顯示啦
Dim
XX
As
New
MyTestDll.Class1
Image1.Picture
=
XX.GetYouPic
End
Sub
'***********************
Over
『貳』 c# 如何將方法封裝成dll類庫
a.打開visualstudio-文件-新建-項目-類庫-名稱MyTestDll;
b.右鍵Class1.cs-修改為TestDll.cs;
c.在讓備裡面寫一個自己想操作的函數;
d.保存-生成解決方案;
e.這是你的Debug文件夾下就會有一個MyTestDll.dll文件,你就可以把它放在你想引用的工程。
『叄』 如何將多個dll封裝到一個dll中
mbox2w.exe或者是其它相似的工具可能對你更有用,你試試。
它可以封裝DLL,也可封裝多個DLL和EXE成為一個獨立程序。
『肆』 如何封裝一個dll文件
在你的項目上,右鍵,選擇屬性凱談,在通用屬性中把生成類型,選擇成,並蠢類庫。
然後重新生成,這樣在你的項目目錄 bin文件夾下就盯蔽碰會產生一個.dll文件。
『伍』 VC++ 程序 如何封裝為dll文件
創建新的動態鏈接庫 (DLL) 項目
從 「文件」菜單中,選擇 「新建」,然後選擇 「項目…」。
在 「項目類型」窗格中,選擇 「Visual C++」下的 「Win32」。
在 「模板」窗格中,選擇 「Win32 控制台應用程序」。
為項目選擇一個名稱,如
MathFuncsDll,並將其鍵入 「名稱」欄位。 為解決方案選擇一個名稱,如
DynamicLibrary,並將其鍵入 「解決方案名稱」欄位。
單擊 「確定」啟動 Win32 應用程序向導。
在 「Win32 應用程序向導」對話框的 「概述」頁中,單擊 「下一步」。
在 「Win32 應用程序向導」中的 「應用程序設置」頁中,選擇 「應用程序類型」下的 「DLL」(如果可用),或者選擇 「控制台應用程序」(如果 「DLL」不可用)。 某些版本的 Visual Studio
不支持通過使用向導創建 DLL 項目。您可以稍後對此進行更改,以將項目編譯為
DLL。
在 「Win32 應用程序向導」的 「應用程序設置」頁中,選擇 「附加選項」下的 「空項目」。
單擊 「完成」創建項目。
向動態鏈接庫添加類
若要為新類創建頭文件,請從 「項目」菜單中選擇 「添加新項…」。
將顯示 「添加新項」對話框。
在 「類別」窗格中,選擇 「Visual C++」下的 「代碼」。 在 「模板」窗格中選擇 「頭文件(.h)」。 為頭文件選擇一個名稱,如
MathFuncsDll.h,並單擊 「添加」。 將顯示一個空白文件。
添加一個名為「MyMathFuncs」的簡單類,以執行常見的算術運算,如加、減、乘和除。代碼應與以下內容類似:
以帶有顏色區分的格式查看復制到剪貼板列印
// MathFuncsDll.h
namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static __declspec(dllexport) double Add(double a, double b);
// Returns a - b
static __declspec(dllexport) double Subtract(double a, double b);
// Returns a * b
static __declspec(dllexport) double Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
static __declspec(dllexport) double Divide(double a, double b);
};
}
// MathFuncsDll.h
namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static __declspec(dllexport) double Add(double a, double b);
// Returns a - b
static __declspec(dllexport) double Subtract(double a, double b);
// Returns a * b
static __declspec(dllexport) double Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
static __declspec(dllexport) double Divide(double a, double b);
};
}
請注意此代碼方法聲明中的 __declspec(dllexport) 修飾符。 這些修飾符使 DLL
能夠導出該方法以供其他應用程序使用。有關更多信息,請參見 dllexport, dllimport。
若要為新類創建源文件,請從 「項目」菜單中選擇 「添加新項…」。
將顯示 「添加新項」對話框。
在 「類別」窗格中,選擇 「Visual C++」下的 「代碼」。 在 「模板」窗格中,選擇 「C++ 文件(.cpp)」。 為源文件選擇一個名稱,如
MathFuncsDll.cpp,並單擊 「添加」。 將顯示一個空白文件。
在源文件中實現「MyMathFuncs」的功能。代碼應與以下內容類似:
以帶有顏色區分的格式查看復制到剪貼板列印
// MathFuncsDll.cpp
// compile with: /EHsc /LD
#include "MathFuncsDll.h"
#include <stdexcept>
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}
double MyMathFuncs::Divide(double a, double b)
{
if (b == 0)
{
throw new invalid_argument("b cannot be zero!");
}
return a / b;
}
}
// MathFuncsDll.cpp
// compile with: /EHsc /LD
#include "MathFuncsDll.h"
#include <stdexcept>
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}
double MyMathFuncs::Divide(double a, double b)
{
if (b == 0)
{
throw new invalid_argument("b cannot be zero!");
}
return a / b;
}
}
若要將項目生成為 DLL,請從
「項目」菜單中選擇
MathFuncsDll 「屬性...」。 在左窗格中,選擇 「配置屬性」下的 「常規」。
在右窗格中,將 「配置類型」更改為 「動態庫(.dll)」。
單擊 「確定」保存更改。
說明
如果您從命令行生成項目,請使用
/LD 編譯器選項指定輸出文件應為 DLL。
有關更多信息,請參見 /MD、/MT、/LD(使用運行庫)。
編譯該動態鏈接庫,方法是選擇
「生成」菜單中的 「生成解決方案」。
這樣就創建了一個可供其他程序使用的
DLL。
『陸』 如何封裝c++程序成dll文件
C++編寫DLL的方法
在寫C++程序時,時常需要將一個class寫成DLL,供客戶端程序調用。這樣的DLL可以導出整個class,也可以導出這個class的某個方法。
一、導出整個class
方法很簡單,只需要在類的頭文件中class和類名之間加上_declspec(dllexport),同時在另外一份提供給客戶端調用程序使用的類的頭文件中class和類名之間加上_declspec(dllimport)。為了能讓客戶端程序和DLL程序公用該類的一份頭文件,通常在類的頭文件中使用宏和預編譯指令來處理。如下DLLTest.h:
#ifdef DLL_TEST_API
#else
#define
DLL_TEST_API _declspec(dllimport)
#endif
Class DLL_TEST_API CDLLTest
{
Public:
CDLLTest();
~CDLLTest();
int Add(
int
a, int
b);
};
DLLTest.cpp如下:
#define
DLL_TEST_API _declspec(dllexport)
#include 「DLLTest.h」
………………………………………
這樣,在DLL編譯時DLL_TEST_API被定義為_declspec(dllexport),而且客戶端程序編譯時它被定義為_declspec(dllimport)。
二、導出這個類的某個或者某幾個方法。
這時,需要將_declspec(dllexport)放到成員函數名前,如DLLTest.h:
#ifdef DLL_TEST_API
#else
#define
DLL_TEST_API _declspec(dllimport)
#endif
Class CDLLTest
{
Public:
CDLLTest();
~CDLLTest();
int DLL_TEST_API Add(
int
a, int
b);
};
但是,如果僅僅是這樣的話,當客戶端程序#include這個頭文件後,定義DLLTest這個類的一個對象後(靜態方式鏈接DLL),客戶端程序無法鏈接通過,會提示構造函數和析構函數無法解析,此時,需要將構造函數和析構函數前也加上DLL_TEST_API宏即可。
當然這里還有個問題就是類的函數在導出後,名字會發生變化,我們可以在函數名前再加上extern 「C」 ,如 extern 「C」 DLL_TEST_API int Add(int a ,int b);但這只解決了C與C++調用時名字變更問題,可靠的方法還是增加一個模塊定義文件def,在該文件中定義導出函數的名稱,我們將在後面看到樣例。
DLL編寫完成後,就只剩下客戶端程序如何去調用該DLL了,靜態方式調用DLL和動態方式調用DLL。
一、靜態方式調用DLL
這個方法就簡單了,將DLLTest.h頭文件和DLLTest.lib,DLLTest.dll文件拷貝到客戶端程序的當前目錄下,在客戶端程序中#include<DLLTest.h>,然後通過#pragma comment(lib,」DLLTest.lib」)的方式引入lib庫,或者在客戶端程序的工程屬性裡面增加對該lib文件的引入。
然後就可以在客戶端程序中如同使用本地的一個class一樣使用該DLL了,如:
CDLLTest dllTest;
dllTest.Add(
1
,2
);
二、動態方式調用DLL
動態調用這個DLL,就需要對這個class進行修改了。
首先,在DLLTest.cpp文件中增加一個全局函數,該函數可以返回這個class的一個實例,這樣,客戶端程序調用這個全局函數後,得到該class的實例,就可以調用該class的實例方法了。
extern
「C」 _declspec(dllexport) CDLLTest* GetInstance()
{
return
new
CDLLTest;
}
註:extern 「C」 只是解決了c與c++編譯器之間的兼容問題,如果需要和其他編譯器之間兼容,可靠的辦法還是增加一個.def文件,文件內容如下:
LIBRARY 「DLLTest」
EXPORTS
GetInstance
= GetInstance
這樣就指定了DLL的函數導出後的名稱仍然不變。
這樣,客戶端程序就可以通過該函數來獲取class的一個實例了。如下:
先需要定義一個函數指針類型:
typedef CDllTestBase* (*pfGetInst)();
//
註:CDllTestBase類後面會介紹。
HMOUDLE hMod
= LoadLibrary( _T(「DLLTest.DLL」) );
if(hMod)
{
pfGetInst pfGetInstance
= (pfGetInst)GetProcAddress(「GetInstance」);
if( p )
{
//
通過基類指針指向派生類對象
CDllTestBase * pInst = pfGetInstance ();
if( NULL
!= pInst )
{
pInst
->Add( 1
,2
);
}
if( NULL
!= pInst )
{
//
釋放對象
delete pInst;
}
}
}
當然,這里還是需要include這個DLL的頭文件DLLTestBase.h,如果將之前所寫的頭文件DLLTest.h直接拷貝到客戶端程序的當前目錄下,並include進來的話,在編譯連接時,是無法通過的,我們需要對這個頭文件進行修改,首先增加一個.h 文件DLLTestBase.h,在這個文件中我們將需要在客戶端程序中調用的函數都命名成純虛函數,然後讓CDLLTest類繼承自CDLLTestBase類,DLLTestBase.h如下:
Class CDLLTestBase
{
Public:
Virtual
~CDLLTestBase(){};//
虛析構函數,且為內聯函數
Virtual int
Add(int
a, int
b) = 0
;
}
DLLTest.h修改後如下:
#include 「DLLTestBase.h」
Class CDLLTest :
public
CDLLTestBase
{
Public:
CDLLTest();
~CDLLTest();
int
Add(int
a, int
b);
};
註:這里的DLLTestBase需要提供一個虛析構函數,這樣在客戶端程序中就可以通過基類指針來釋放派生類對象了。
這樣,只需要將DLLTestBase.h拷貝到客戶端程序的當前目錄下,然後在客戶端程序中#include」DLLTestBase.h」,就可以如上面介紹一樣在客戶端程序中調用DLL裡面的方法了。