程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 如何用VC編寫供PB調用的DLL

如何用VC編寫供PB調用的DLL

編輯:vc教程

VC PB dll

和編寫一般的DLL方法相同,需要注意以下兩點:

(1)調用約定

C函數有_stdcall、_cdecl、_fastcall等多種調用約定,調用約定用來說明函數參數的壓棧順序和由誰(函數自身還是調用者)來修改堆棧。關於調用約定的詳細說明,請參考我轉載的另一篇文章。

編寫供PB調用DLL,請使用_stdcall調用約定,如下所示:

extern "C" _declspec(dllexport) int _stdcall GetInt(char* name)
{
...
}

(2)def文件
在VC++中,如果生成DLL可以不使用.def文件,只需要在VC++的函數定義前加__declspec(dllexport)修飾就可以了。生成的DLL VC++用戶可以直接使用,但PB、VB等用戶使用會遇到函數名轉換的問題。因為VC++對於__declspec(dllexport)聲明的函數會進行名稱轉換,如下面的函數:

__declspec(dllexport) int _stdcall GetStr()

 編譯後會轉換為 GetStr@0,這樣在PB、VB中聲明函數時應該聲明GetStr@0,如果函數帶有參數,轉換後的函數名將更加復雜,這使PB、VB用戶使用起來很不方便。在def文件中由EXPORT輸出函數可解決這個問題。
如dll要輸出如下兩個函數:
extern "C" _declspec(dllexport) int _stdcall GetInt(char* name);
extern "C" _declspec(dllexport) char* _stdcall GetStr(int id);

則def文件書寫如下(TEST為工程名):
LIBRARY      "TEST"
DESCRIPTION  'TEST Windows Dynamic Link Library'

EXPORTS
    ; Explicit exports can go here
GetInt @1
GetStr @2  

編譯生成DLL後,在PB中要調用GetStr函數,只需做如下聲明即可:

function string GetStr(int a) library("TEST.dll");

注意,如果您建的是Win32 Dynamic-Link Library 工程,def文件需要自己創建,然後把它加入工程,def文件名需和工程名相同。如您的工程名為test,則創建test.def。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved