A. c# dll 調用窗體
基本不可能,涉及到啟動窗體和線程的問題
沒懂什麼意思,你想移動dll做什麼
B. 誰知道vc里怎麼調用dll里的資源窗體啊
INT_PTR DialogBoxParam(
HINSTANCE hInstance, // handle to mole
LPCTSTR lpTemplateName, // dialog box template
HWND hWndParent, // handle to owner window
DLGPROC lpDialogFunc, // dialog box procere
LPARAM dwInitParam // initialization value
);
C. DLL中如何使用窗體
留意,在Dll中調用Form,必須要有AOwner,即Application。var P: PCHAR): Boolean; stdcall; 你的法度榜樣有兩個不當:iinput的Application為不法值,因為你沒有創 所以,你的函數iinput應當申明為function iinput(AH: THandle; 建(在Application中是主動的,而Dll中卻不是);返回值不要用String,最好由主法度榜樣傳遞參數.
D. 如何將窗體做成一個dll
2. 編輯你需要的窗體。(相信這個你也沒有問題)
3. 運行,調試。保證你的窗體功能正常了。(別嫌我羅嗦哦^^)
4. 在你的「解決方案」面板上(如果沒有,就點Ctrl-Alt-L),找到你的工程(默認是第二行)。點擊滑鼠右鍵。
5. 點擊「屬性」菜單項。
6. 如果是2003,會出來一個對話框。如果是2005,會在編輯代碼的那裡新出來一頁。但是內容都是類似的。
7. 現在找到「輸出類型」,下拉框中得值應該是「Windows Application」,現在改成「Class Library」。
8. 點擊「確定」(2003)或 Ctrl-S(2005)來保存修改。
9. Ctrl-Shift-B,來重新編譯。
10. 好了,你現在在工程文件的bin\Debug 或者 bin\Release中找到編譯好的dll了。
現在你需要記住三件事:
1. dll的文件路徑。
2. 你編輯的窗體的命名空間(namespace)。
3. 你編輯的窗體的類名。
好了,現在開始引用:
1. 創建好一個新的工程。
2. 在你的「解決方案」面板上(如果沒有,就點Ctrl-Alt-L),找到References(默認是第三行),點擊右鍵。
3. 選擇「添加引用...」菜單項。
4. 會彈出一個對話框。點擊Borwse,找到你剛才寫的那個dll文件。打開。
5. 現在,在對話框的列表中找到你剛剛打開的那個dll的名字。點擊「選擇」按鈕。
6. 點擊「確定」按鈕,關閉對話框。
好了,現在就可以使用你封裝的窗體了。
E. 怎麼在dll中創建窗口,並調用該窗口
在dll項目中,新加類 ,繼承CDialog就行
然後在dll的cpp文件中
這樣調用
//加在inclue文件後面
CTest test;
extern "C" __declspec(dllexport) void Show()
{
AFX_MANAGE_STATE(AfxGetStaticMoleState());
if(!test.create)
{
test.Create(IDD_DIALOG1);
test.ShowWindow(SW_SHOWNOACTIVATE);
}
else
{
test.ShowWindow(SW_SHOWNOACTIVATE);
}
}
dll的相關函數中call這個 show()函數就行
F. 如何在dll類庫的窗體中引用主程序窗體的值
1 關聯form1.textbox1.text的文本改變事件
2 在dll中公布一個方法,當form1.textbox1.text的文本改變後主動調用這個方法
G. c# 怎麼把窗體寫到dll里去
1. 建立一個新工程。(相信這個你會)
2. 編輯你需要的窗體。(相信這個你也沒有問題)
3. 運行,調試。保證你的窗體功能正常了。(別嫌我羅嗦哦^^)
4. 在你的「解決方案」面板上(如果沒有,就點Ctrl-Alt-L),找到你的工程(默認是第二行)。點擊滑鼠右鍵。
5. 點擊「屬性」菜單項。
6. 如果是2003,會出來一個對話框。如果是2005,會在編輯代碼的那裡新出來一頁。但是內容都是類似的。
7. 現在找到「輸出類型」,下拉框中得值應該是「Windows Application」,現在改成「Class Library」。
8. 點擊「確定」(2003)或 Ctrl-S(2005)來保存修改。
9. Ctrl-Shift-B,來重新編譯。
10. 好了,你現在在工程文件的bin\Debug 或者 bin\Release中找到編譯好的dll了。
現在你需要記住三件事:
1. dll的文件路徑。
2. 你編輯的窗體的命名空間(namespace)。
3. 你編輯的窗體的類名。
好了,現在開始引用:
1. 創建好一個新的工程。
2. 在你的「解決方案」面板上(如果沒有,就點Ctrl-Alt-L),找到References(默認是第三行),點擊右鍵。
3. 選擇「添加引用...」菜單項。
4. 會彈出一個對話框。點擊Borwse,找到你剛才寫的那個dll文件。打開。
5. 現在,在對話框的列表中找到你剛剛打開的那個dll的名字。點擊「選擇」按鈕。
6. 點擊「確定」按鈕,關閉對話框。
好了,現在就可以使用你封裝的窗體了。
H. VB怎樣調用DLL中的資源
一般VB.NET調用DLL可以通過Declare 語句在模塊級用於聲明對動態鏈接庫 (DLL) 中的外部過程的引用。
Private Declare Sub
myFunc1 Lib "mylib.dll"
(ByVal strName As String)
但是,VB.NET,C#.NET創建的DLL是個類庫,不能生成標準的 DLL 文件,不能採用declare ()的方式。應該在解決方案資源管理器下的需要引用的項目的引用欄點擊滑鼠右鍵-->添加對這個類庫[mylib.dll]的引用即可。
以下為VB.NET調用DLL代碼示例:
< DllImport("kcomm.dll", CharSetCharSet:
=CharSet.Ansi, SetlastError:=True)>
Private Shared Function gettxt(ByVal
port As Integer, ByVal wait As
Integer, ByVal _date As Long,
ByVal _time As Long, ByVal
filename As String) As Integer
End Function
根據實際情況更改你的DLL名稱、函數名、參數名和類型。
VB.NET調用DLL的只是COM組件,無法作為輸出函數的DLL,其實這只是個錯誤的說法。其實MS非常狡猾,如果你是個VB瘋狂發燒友的話,應該早就狂試出這種可以創建輸出函數的DLL的方法。
VB編譯文件實際上採取了兩次編譯的方法,首先是調用C2.exe產生*.OBJ文件,然後調用Link.EXE連接。如果在LINK的時候添加EXPORT選項,實際上是可以輸出函數的。但是,在VB的工程選項中將這些屏蔽了。而且過分的是:VB在Build完成後會將OBJ文件刪除,這樣就無法手動通過Link來創建我們需要的DLL了。不過我找到一個比較齷鹺的變通的方法,就是先創建一個Exe工程,在Form_Load事件裡面寫下面的語句:
Sub Main
If MsgBox("哈哈",
vbOKCancel) = vbOK Then
Shell "link2.exe "
& Command$
End If
End Sub
然後編譯為LinkTemp.EXE,接下來將LINK.EXE改名為Link2.exe,將LinkTemp.EXE改名為Link.EXE。這樣在VB調用Link.EXE時會彈出對話框,處理就會中斷。這時就可以有機會將OBJ文件拷貝出來了。
然後我創建了一個ActiveX DLL工程,在這個工程裡面添加一個Mole並創建一個Public函數mathadd:
Public Function mathadd
(ByVal a As Long, ByVal
b As Long) As Long
mathadd = a + b
End Function
編譯這個工程,在Link的時候就會中斷。然後把創建的Class1.obj、Mole1.obj、Project1.obj備份出來。然後就可以調用Link2.exe連接OBJ到DLL了,我的連接代碼是:
Link2.exe "e:\\vbdll\\Class1.obj"
"e:\\vbdll\\Mole1.obj"
"e:\\vbdll\\Project1.obj"
"E:\\Program Files\\Microsoft
Visual Studio\\VB98\\VBAEXE6.LIB"
/ENTRY:__vbaS /EXPORT:mathadd /OUT:
"e:\\vbdll\\ProjectOK.dll"
/BASE:0x11000000 /SUBSYSTEM:
WINDOWS,4.0 /VERS
注意裡面的/ENTRY和/EXPORT開關,/EXPORT開關聲明了輸出函數mathadd。這樣就大功告成了,可以被其他語言引入,例如在VB中,只需要:
Private Declare Function mathadd
Lib "e:\\vbdll\\ProjectOK.dll"
(ByVal a As Long, ByVal b As
Long) As Long
I. 如何在DLL中創建窗體
你的EXE是如何載入這個DLL的?
要知道如果是隱式鏈接,如果不引用DLL中的任何導出函數,則鏈接器會把該DLL從EXE的導入段中給取出的,最終導致DLL根本不會被載入到進程中。樓主需要用「進程查看器」之類的工具看下你的DLL是不是真的被載入到了EXE的地址空間了。
既然是DLL,那麼DLL中最基本的DllMain含義樓主應該清楚吧,就像學習控制台編程,如果連main的含義都是一知半解就糟糕了。
要知道DllMain在 ul_reason_for_call等於DLL_PROCESS_ATTACH時,必須使DllMain函數返回TRUE,EXE才會成功載入該DLL的。
不管是隱式鏈接,還是顯式鏈接, ul_reason_for_call的值最初都是DLL_PROCESS_ATTACH,我看見樓主的DLL代碼根本就不對 ul_reason_for_call的值進行任何檢查。起初, ul_reason_for_call的值為DLL_PROCESS_ATTACH,樓主必須應該使DllMain返回(return)TRUE,只有醬子EXE才會真正載入了這個DLL,可while(...)代碼使得DllMain這個函數根本沒有機會返回TRUE or FALSE;最奇怪的是最後是return messages.wParam。對於while這個語句的調用究竟放哪裡好呢?呵呵,有辦法的,但解釋起來太麻煩了,估計樓主也無法理解。
樓主程序的構建環境是DLL,不能照搬EXE中的代碼的,需要靈活運用,靈活應用的基礎是要理解代碼的含義,光知道有什麼函數,有什麼數據結構和怎樣的調用順序是遠遠不夠的。
另外,提醒的是在DLL的DllMain有個很重要的hMole參數,這個參數就如同人的脊椎骨,絕對不能無視它的存在。像wincl.hInstance 的值就應該是hMole.
hMole究竟是什麼東西,樓主需要有兩塊基石,一塊是「進程地址空間布局」的分支知識,另一塊是「PE文件布局」的分支知識。不易學習!
最後,不對ul_reason_for call進行檢查也會使事情一團糟。要知道DllMain這個函數並不是只會被EXE調用一次的,當EXE程序對應的進程創建一個新的線程時,該函數也會被調用的,這個時候ul_reason_for_call值為DLL_THREAD_ATTACH,想像一下,如果進程里又創建了個新線程,樓主的DLL又會再創建一個窗口,這個算什麼呢?當然,這個窗口在第二次是創建不起來的,因為RegisterClassEx會失敗。
J. 如何在dll中調用外部exe程序里的窗口
你是說要怎麼寫dll?,還是怎麼調用你寫的dll?怎麼寫dll:vc++6.0的話,在創建新工程時常用的選擇以下任意一個:MFCAppWizard[dll]可以使用MFC框架的動態連接庫Win32Dynamic-linkLibrarywindow32位標准動態庫然後選擇你需要的框架