導航:首頁 > 源碼編譯 > vfp編譯成dll

vfp編譯成dll

發布時間:2023-02-02 08:40:25

❶ 如何編譯生成dll

使用VC下的cl和link手工創建dll並實現函數導入

1、創建dll頭文件:
/*
* dllmain.h
*/
#ifndef _DLLMAIN_H
#define _DLLMAIN_H

int getNumber();

#endif

2、創建dll源文件:
/*
* dllmain.c
*/
#include "dllmain.h"

int getNumber()
{
return 10;
}

3、 創建def文件:
; export.def
LIBRARY MY_DLLMAIN ; MY_DLLMAIN 將成為生成的dll的名稱
EXPORTS
getNumber @1 ; 這個名稱即為函數的實際導出名稱 @1為函數的導出編號

4、生成dll文件:
cl dllmain.c /c
link /def:export.def /dll dllmain.obj

這時,工程中已經包含了 dllmain.h dllmain.c export.def dllmain.obj dllmain.lib dllmain.exp MY_DLLMAIN.dll 其中,後4個文件是編譯鏈接過程中生成的文件

5、創建dlltest.c:
/*
* dlltest.c
*/
#include <stdio.h>
#include "dllmain.h" //dll庫的頭文件

#pragma comment(lib,"dllmain.lib") //dllmain.lib即是上一步生成的文件

int main()
{
printf("%dn",getNumber());
}

6、編譯、鏈接dlltest.c
cl dlltest.c /c
link dlltest.obj

注意:這里dllmain.lib和dllmain.h應該和dlltest.c在同一個目錄中。此步的結果將生成 dlltest.exe

7、運行:
dlltest

這時,系統將載入my_dllmain.dll這個動態鏈接庫,將調用其中的getNubmer函數。

❷ vfp如何調用C#編譯的dll

這個跟調用其他dll方法一樣的. 你試試如下方法:

假如該方法返回整型值, 2個參數都是字元型
DECLARE integer getainfo IN a.dll String,string
b=getainfo(參數1,參數2)

位置一般放到程序設置的默認目錄下, 或者用set path to 指定的路徑

❸ VFP如何編譯

一、在本機編譯、運行exe文件的做法:

⑴在項目中選中一個表單或prg文件,目的是作為主文件(啟動文件);
⑵點擊菜單"項目",選"設置主文件",選中的文件就為主文件;
⑶在項目窗口中選"連編",連編窗口選"連編可執行文件",選擇路徑和輸入你要生成的exe文件的名字,連編就生成了可執行文件。

二、 你自己用vfp作一個發布安裝盤,刻成光碟,送給用戶:。
用vfp作一個發布安裝盤,步驟:
1 將要發布的文件(.exe,...)復制到一個文件夾中(假設為d:\xxx)
2 運行 vfp6,工具-〉向導-〉安裝,在發布樹在哪個目錄對話框中,選擇d:\xxx,下一步
3在步驟2,中如果你在程序中,沒有用到控制項,單擊 下一步即可,否則選定您用到的第三方控制項
4在 步驟3磁碟映像 中 選擇網路安裝,並選個一個要生成的目錄(如d:\MySetup)下一步
5 在 步驟4安裝選項 的 安裝對話標題 中輸入標題 如:建築設備管理系統 版權信息 下一步
6 安裝目錄、程序組(最好也寫:如:建築設備管理系統)下一步
7 下一步
8 完成
9 退出vfp60
10 到 D:\mysetup\netsetup 下,將文件刻錄到光碟(或拷貝U盤)到客戶機上,setup即可。

❹ vfp生成dll

把所有的文件都包含在項目中,全部編譯到EXE文件中,別人就看不見改不了了。

❺ 如何將VFP9.0的prg文件編譯成exe文件

1.建立一個Project , 執行 BUILD,選擇 Win32 executable,編譯出 EXE
2 .把多個 VFPxxx.Dll, msvcr71.DLL 與編譯出來的 EXE 放在同一目錄,即可

❻ 怎樣用VPF把文件編譯成.exe文件

vfp 6.0下:
把以下文件VFP6R.DLL,vfp6rchs.dll,vfp6renu.dll放到windows\system32下,或程序目錄下即可.

❼ VFP編寫的dll 能不能給VC調用

可以的,vfp寫的DLL是COM模式,需要先注冊後才能調用。而且DLL內部所含的方法是看不到的,需要開發者提供 方法名 和參數列表,返回值類型。具體的調用方法是用Createobj()...

❽ 在vfp如何聯編急要詳細步驟

新建一個項目,把你的表單、報表、程序之類反正你編的東西都加進去,
如果你運行的是一個程序的話,直接把它設為主程序,
否則新建一個主程序,
格式參考如下:
do form forms\kl *你首先運行的表單,如果是其它的,自己改一下
on shutdown quit
read event

如果您的程序全部都編好了就可以開始編譯您的軟體了,很簡單,方法如下:
1.按下項目管理器中的連編,出現對話框;
2.選擇「連編可執行程序」,確定;
3.輸入編譯後的EXE文件名,注意目錄,然後保存;
接著系統便進入編譯過程,這一過程是電腦自動完成的。在這一過程中系統會首先檢查您的程序是否有錯誤,如有錯誤有時會給出提示,在提示中您一般可以選擇「忽略」、「全部忽略」、「取消」,這里的「忽略」就是不管出現的錯誤繼續編譯,當然一般不應該這樣,一旦出現錯誤提示應選擇取消,然後找出相應的錯誤,改正後再編譯。為了容易查找錯誤,系統還將錯誤記錄下來,在菜單的「項目」-「錯誤」中可以看到,其中會講明是什麼錯誤,發生在哪個程序的哪一條語句中。對於有些錯誤會不給出提示而直接忽略,但它仍然會把錯誤記錄下來。
如果系統編譯時沒有記錄錯誤,那是因為在菜單上的「工具」-「選項」-「常規」-「編程」中的「記錄編譯錯誤」沒有打開。

VFP編譯生成的EXE文件是不能直接在另一台電腦上運行的,除非該電腦中已經裝有VFP系統,因為EXE文件的運行要依賴於安裝在WINDOWS系統中的運行時的庫。為此要為該軟體製作一套安裝盤,方法如下:
在您開發的軟體的目錄下建一個子目錄,比如叫exe,當然您也可以建在別什麼地方或叫別的什麼名字;
將該軟體所要用到的資料庫(dbc)、資料庫備注(dct)、資料庫索引(dcx)、表(dbf)、表索引(cdx、idx)、表備注(fpt)、內存變數文件(mem)等等,再就是編譯後的exe文件通通復制到上面所建的目錄中,然後將復制過去的數據表中試運行用的記錄清除,但要注意有些數據可能是軟體預先應提供的,那麼就不應該刪除,如與軟體一起提供給用戶的。
注意:prg文件、菜單文件、表單文件、報表文件、標簽文件等等不要復制進去,因為它們已經被編譯在exe文件中了,還有就是不屬於軟體運行的文件,如系統分析文件,也不要復制進去。

不用製作安裝盤,不需安裝VFP也可以.只需要在默認目錄下能找到相應的.DLL文件,VFP編譯的EXE文件就能正常運行.
對於VFP5編譯的程序,.DLL文件是VFP500.DLL,VFP500CHS.DLL.對於VFP6編譯的程序,DLL文件是VFP6R.DLL,VFP6RCHS.DLL,對於VFP7編譯的程序,DLL文件是MSVCR70.DLL,VFP7R.DLL,VFP7RCHS.DLL.
在發布你的應用程序時,將EXE文件和上述DLL文件拷貝到同一個目錄下就可以了.

❾ 如何編譯生成dll

創建DLL工程
這里,我們為了簡要說明DLL的原理,我們決定使用最簡單的編譯環境VC6.0,如下圖,我們先建立一個新的Win32 Dynamic-Link Library工程,名稱為「MyDLL」,在Visual Studio中,你也可以通過建立Win32控制台程序,然後在「應用程序類型」中選擇「DLL」選項,

點擊確定,選擇「一個空的DLL工程」,確定,完成即可。

一個簡單的dll
在第一步我們建立的工程中建立一個源碼文件」dllmain.cpp「,在「dllmain.cpp」中,鍵入如下代碼

[cpp] view plain
#include <Windows.h>
#include <stdio.h>

BOOL APIENTRY DllMain(HMODULE hMole, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
printf("DLL_PROCESS_ATTACH\n");
break;
case DLL_THREAD_ATTACH:
printf("DLL_THREAD_ATTACH\n");
break;
case DLL_THREAD_DETACH:
printf("DLL_THREAD_DETACH\n");
break;
case DLL_PROCESS_DETACH:
printf("DLL_PROCESS_DETACH\n");
break;
}
return TRUE;
}
之後,我們直接編譯,即可以在Debug文件夾下,找到我們生成的dll文件,「MyDLL.dll」,注意,代碼裡面的printf語句,並不是必須的,只是我們用於測試程序時使用。而DllMain函數,是dll的進入/退出函數。

實際上,讓線程調用DLL的方式有兩種,分別是隱式鏈接和顯式鏈接,其目的均是將DLL的文件映像映射進線程的進程的地址空間。我們這里只大概提一下,不做深入研究,如果感興趣,可以去看《Window高級編程指南》的第12章內容。
隱式鏈接調用
隱士地鏈接是將DLL的文件影響映射到進程的地址空間中最常用的方法。當鏈接一個應用程序時,必須制定要鏈接的一組LIB文件。每個LIB文件中包含了DLL文件允許應用程序(或另一個DLL)調用的函數的列表。當鏈接器看到應用程序調用了某個DLL的LIB文件中給出的函數時,它就在生成的EXE文件映像中加入了信息,指出了包含函數的DLL文件的名稱。當操作系統載入EXE文件時,系統查看EXE文件映像的內容來看要裝入哪些DLL,而後試圖將需要的DLL文件映像映射到進程的地址空間中。當尋找DLL時,系統在系列位置查找文件映像。

1.包含EXE映像文件的目錄
2.進程的當前目錄
3.Windows系統的目錄
4.Windows目錄
5.列在PATH環境變數中的目錄

這種方法,一般都是在程序鏈接時控制,反映在鏈接器的配置上,網上大多數講的各種庫的配置,比如OPENGL或者OPENCV等,都是用的這種方法

顯式鏈接調用
這里我們只提到兩種函數,一種是載入函數
[cpp] view plain
HINSTANCE LoadLibrary(LPCTSTR lpszLibFile);

HINSTANCE LoadLibraryEx(LPCSTR lpszLibFile,HANDLE hFile,DWORD dwFlags);
返回值HINSTANCE值指出了文件映像映射的虛擬內存地址。如果DLL不能被映進程的地址空間,函數就返回NULL。你可以使用類似於

[cpp] view plain
LoadLibrary("MyDLL")
或者

[cpp] view plain
LoadLibrary("MyDLL.dll")
的方式進行調用,不帶後綴和帶後綴在搜索策略上有區別,這里不再詳解。

顯式釋放DLL

在顯式載入DLL後,在任意時刻可以調用FreeLibrary函數來顯式地從進程的地址空間中解除該文件的映像。
[cpp] view plain
BOOL FreeLibrary(HINSTANCE hinstDll);
這里,在同一個進程中調用同一個DLL時,實際上還牽涉到一個計數的問題。這里也不在詳解。
線程可以調用GetMoleHandle函數:

[cpp] view plain
GetMoleHandle(LPCTSTR lpszMoleName);
來判斷一個DLL是否被映射進進程的地址空間。例如,下面的代碼判斷MyDLL.dll是否已被映射到進程的地址空間,如果沒有,則裝入它:

[cpp] view plain
HINSTANCE hinstDll;
hinstDll = GetMoleHandle("MyDLL");
if (hinstDll == NULL){
hinstDll = LoadLibrary("MyDLL");
}
實際上,還有一些函數,比如 GetMoleFileName用來獲取DLL的全路徑名稱,FreeLibraryAndExitThread來減少DLL的使用計數並退出線程。具體內容還是參見《Window高級編程指南》的第12章內容,此文中不適合講太多的內容以至於讀者不能一下子接受。

DLL的進入與退出函數

說到這里,實際上只是講了幾個常用的函數,這一個小節才是重點。
在上面,我們看到的MyDLL的例子中,有一個DllMain函數,這就是所謂的進入/退出函數。系統在不同的時候調用此函數。這些調用主要提供信息,常常被DLL用來執行進程級或線程級的初始化和清理工作。如果你的DLL不需要這些通知,就不必再你的DLL源代碼中實現此函數,例如,如果你創建的DLL只含有資源,就不必實現該函數。但如果有,則必須像我們上面的格式。
DllMain函數中的ul_reason_for_call參數指出了為什麼調用該函數。該參數有4個可能值: DLL_PROCESS_ATTACH、DLL_THREAD_ATTACH、DLL_THREAD_DETACH、DLL_PROCESS_DETACH。
其中,DLL_PROCESS_ATTACH是在一個DLL首次被映射到進程的地址空間時,系統調用它的DllMain函數,傳遞的ul_reason_for_call參數為DLL_PROCESS_ATTACH。這只有在首次映射時發生。如果一個線程後來為已經映射進來的DLL調用LoadLibrary或LoadLibraryEx,操作系統只會增加DLL的計數,它不會再用DLL_PROCESS_ATTACH調用DLL的DllMain函數。
而DLL_PROCESS_DETACH是在DLL被從進程的地址空間解除映射時,系統調用它的DllMain函數,傳遞的ul_reason_for_call值為DLL_PROCESS_DETACH。我們需要注意的是,當用DLL_PROCESS_ATTACH調用DLL的DllMain函數時,如果返回FALSE,說明初始化不成功,系統仍會用DLL_PROCESS_DETACH調用DLL的DllMain。因此,必須確保沒有清理那些沒有成功初始化的東西。
DLL_THREAD_ATTACH:當進程中創建一個線程時,系統察看當前映射到進程的地址空間中的所有DLL文件映像,並用值DLL_THREAD_ATTACH調用所有的這些DLL的DllMain函數。該通知告訴所有的DLL去執行線程級的初始化。注意,當映射一個新的DLL時,進程中已有的幾個線程在運行,系統不會為已經運行的線程用值DLL_THREAD_ATTACH調用DLL的DllMain函數。
而DLL_THREAD_DETACH,如果線程調用ExitThread來終結(如果讓線程函數返回而不是調用ExitThread,系統會自動調用ExitThread),系統察看當前映射到進程空間的所有DLL文件映像,並用值DLL_THREAD_DETACH來調用所有的DLL的DllMain函數。該通知告訴所有的DLL去執行線程級的清理工作。
這里,我們需要注意的是,如果線程的終結是因為系統中的一個線程調用了TerminateThread,系統就不會再使用DLL_THREAD_DETACH來調用DLL和DllMain函數。這與TerminateProcess一樣,不再萬不得已時,不要使用。
下面,我們貼出《Window高級編程指南》中的兩個圖來說明上述四種參數的調用情況。

好的,介紹了以上的情況,下面,我們來繼續實踐,這次,建立一個新的空的win32控制台工程TestDLL,不再多說,代碼如下:

[cpp] view plain
#include <iostream>
#include <Windows.h>
using namespace std;

DWORD WINAPI someFunction(LPVOID lpParam)
{
cout << "enter someFunction!" << endl;
Sleep(1000);
cout << "This is someFunction!" << endl;
Sleep(1000);
cout << "exit someFunction!" << endl;
return 0;
}

int main()
{
HINSTANCE hinstance = LoadLibrary("MyDLL");
if(hinstance!=NULL)
{
cout << "Load successfully!" << endl;
}else {
cout << "Load failed" << endl;
}
HANDLE hThread;
DWORD dwThreadId;

cout << "createThread before " << endl;
hThread = CreateThread(NULL,0,someFunction,NULL,0,&dwThreadId);
cout << "createThread after " << endl;
cout << endl;

Sleep(3000);

cout << "waitForSingleObject before " << endl;
WaitForSingleObject(hThread,INFINITE);
cout << "WaitForSingleObject after " << endl;
cout << endl;

FreeLibrary(hinstance);
return 0;
}

代碼很好理解,但是前提是,你必須對線程有一定的概念。另外,注意,我們上面編譯的獲得的「MyDLL.dll"必須拷貝到能夠讓我們這個工程找到的地方,也就是上面我們提到的搜索路徑中的一個地方。
這里,我們先貼結果,當然,這只是在我機器上其中某次運行結果。

有了上面我們介紹的知識,這個就不是很難理解,主進程在調用LoadLibrary時,用DLL_PROCESS_ATTACH調用了DllMain函數,而線程創建時,用DLL_THREAD_ATTACH調用了DllMain函數,而由於主線程和子線程並行的原因,可能輸出的時候會有打斷。但是,這樣反而能讓我們更清楚的理解程序。

閱讀全文

與vfp編譯成dll相關的資料

熱點內容
電腦如何實現跨網段訪問伺服器 瀏覽:549
模塊化網頁源碼位元組跳動 瀏覽:485
梯度下降演算法中遇到的問題 瀏覽:605
伺服器連接電視怎麼接 瀏覽:323
phploop語句 瀏覽:500
交叉編譯工具鏈里的庫在哪 瀏覽:781
安卓手q換號怎麼改綁 瀏覽:399
nba球星加密貨幣 瀏覽:789
命令看網速 瀏覽:124
java堆分配 瀏覽:161
linuxbuiltin 瀏覽:560
cstpdf 瀏覽:941
texstudio編譯在哪 瀏覽:352
國家反詐中心app注冊登記表怎麼注冊 瀏覽:972
加密機默認埠 瀏覽:101
有哪個網站有免費的python源代碼 瀏覽:304
蘋果手機如何導入安卓電話 瀏覽:915
奧利奧雙重解壓 瀏覽:388
安卓賬號怎麼在蘋果手機上玩 瀏覽:798
畫畫用什麼安卓ipad好 瀏覽:693