1. 程式人生 > >c/c++中_stdcall與dll動態呼叫

c/c++中_stdcall與dll動態呼叫

1._stdcall在動態dll呼叫中的注意事項

為了用vc寫的dll能被其它語言的寫的程式使用,即實現跨語言。我們在dll的函式呼叫約定中使用__stdcall .

但當用GetProcAddress呼叫是卻失敗了.

用dumpbin工具檢視匯出的函式名可以看到:匯出的函式名確實為_

所以我們要阻止匯出的函式名被編譯器修改,方法就是使用def檔案

; xxx.def : Declares the module parameters for the DLL.
LIBRARY      "xxx"
EXPORTS
    ; Explicit exports can go here
   

[email protected]

這樣重新呼叫GetProcAddress就正確了

並且在函式指標定義和GetProcAddress時必須把__stdcall 加上否則執行時會報錯

void (_stdcall *mygetGrad)(unsigned char*, unsigned char*, int, int, long);

2. .c檔案中函式中間宣告變數有時會報錯,把宣告放到最前面就ok,不知道為啥

3.動態載入要#include <windows.h>

4.LoadLibraryA與LoadLibrary

LoadLibrary動態載入dll失敗,把LoadLibrary改為LoadLibraryA就ok

  HMODULE hDllInst;
  void (_stdcall *mygetGrad)(unsigned char*, unsigned char*, int, int, long);
  hDllInst = NULL;
  mygetGrad = NULL;
  hDllInst = LoadLibraryA("FignerPrintAnalysis.dll");

  mygetGrad = (void (_stdcall *)(unsigned char*, unsigned char*, int, int, long))GetProcAddress(hDllInst,"mygetGrad");

參考

http://blog.csdn.net/cglover/article/details/1621685

http://blog.csdn.net/guoyong10721073/article/details/52399027

http://blog.csdn.net/dybinx/article/details/7709822

相關推薦

c/c++_stdcalldll動態呼叫

1._stdcall在動態dll呼叫中的注意事項 為了用vc寫的dll能被其它語言的寫的程式使用,即實現跨語言。我們在dll的函式呼叫約定中使用__stdcall . 但當用GetProcAddress呼叫是卻失敗了. 用dumpbin工具檢視匯出的函式名可以看到

VS2008 C++呼叫DLL 動態呼叫

為了共享程式碼,需要生成標準的dll,本文將介紹在vs2008 C++生成及呼叫dll。 一、生成DLL     生成一個名為FunDll的dll檔案,對外函式為addl。    step1:vs2008 環境下,檔案-->新建專案,選擇visual c++,

C++ mapfindcount的使用

使用count,返回的是被查詢元素的個數。如果有,返回1;否則,返回0。注意,map中不存在相同元素,所以返回值只能是1或0。 使用find,返回的是被查詢元素的位置,沒有則返回map.end()。 例子: 1 #include 2 #include 3 #include 4 #

pythonC互動傳入讀取記憶體空間

使用用python呼叫c程式碼中,從外部傳入一個固定大小的記憶體空間,這段記憶體需要是可寫的 首先看下c中的函式 typedef struct ModelData { unsigned int model_len; //資料長度 char*

C語言陣列指標的區別

本文是對《C語言深度剖析》一書內容的拓展,在看這本書的時候解了很多我之前的一些困惑,故在此記錄。對陣列的引用總是可以寫成對指標的引用,而且確實存在一種指標和陣列的定義完全相同的上下文環境。 但是指標和陣列還是在本質上是不一樣的。指標就是指標,指標變數在32位的系統下面是4B

C#:vs封裝成dll and 呼叫生成的dll

生成dll C#封裝dll的方法很簡單: 1. Visual C#-->類庫,在程式設計介面寫上需要封裝的程式,設定好名稱空間和類名      或者,專案屬性->應用程式->輸出型別->改成類庫,定義好名稱空間和類名,在專案中

C語言指標指標陣列的理解!

指標就是地址! 概念 C語言中,允許用一個變數來存放地址,這種變數稱為指標變數。一個指標變數的值就是某個記憶體單元的地址。指標變數就是用來存放指標(地址)的變數! &運算子:求某一變數在儲存單元中的記憶體地址。 *運算子:取出指標變數所指向變數的內容,後面

C++基礎:類物件(物件呼叫成員函式 this指標)

1.一個物件的this指標並不是物件本身的一部分,不會影響sizeof(物件)的結果。this作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的地址作為一個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候

C# ORM反射泛型的交叉應用

好久沒有寫文章了,終於找到工作,抽空寫一下冒個泡。 問題 最近遇到一個這樣 ORM 的問題,一個返回型別為 List 泛型方法中,需要做到根據條件訪問資料庫,並且把得到的結果存入 List 中返回。 由於只是以前學過一段時間的 C#,而且反射

C語言字串整數的相互轉換

C語言提供了幾個標準庫函式,可以將任意型別(整型、長整型、浮點型等)的數字轉換為字串,下面列舉了各函式的方法及其說明。 # include <stdlib.h> 將數字轉換為字串   ● itoa():將整型值轉換為字串。   ● ltoa():將長整

C程式碼檔案如何生成Dll動態連結庫

已經有c程式碼檔案,如何生成dll,並能然後c#呼叫裡面的函式: 1.在vs裡面新建一個c++的空專案,把c程式碼都載入進去,然後更改專案的屬性, 如下圖: 配置型別改為動態庫.dll。 2.新增.def檔案,並編輯檔案內容 LIBRARY EXPORTS test1 @

C語言字串各數值型別之間的轉換

c語言的演算法設計中,經常會需要用到字串,而由於c語言中字串並不是一個預設型別,其標準庫stdlib設計了很多函式方便我們處理字串與其他數值型別之間的轉換。首先放上一段展示各函式使用的程式碼,大家也可以copy到自己的機器上執行觀察#include <stdio.h&g

c++builderTDateTimectime_t的轉換

c++builder中日期時間控制元件Tdatetimepicker不能同時更改日期和時間,只好用了2個控制元件,其中一個kind屬性改為dtkTime表明是時間,另一個預設是日期,設定2個空間change事件聯動,最後取值與time_t轉換 void __fastcall

C/C++_NULL空字串的區別

今天遇到一個問題認識到C/C++中 NULL 與 空字串 "" 是不相同的 總結如下: 空字串是"",會建立一個物件,內容是"",有記憶體空間。 而NULL,不會建立物件,沒有記憶體空間。形象的比

swift專案 OCswift相互呼叫

swift呼叫oc的方法: 1、橋接檔案,一般是swift工程,在建立一個oc檔案時,系統自動新增(不用改名,直接預設即可) 2、將需要引用的oc檔案 .h標頭檔案 新增到橋接類中。 具體方法可以參考我的這篇部落格,裡面進行了詳細講解 oc呼叫swift 1、首先設定一

利用c#實現dll動態庫,並在c++呼叫的方法

           近期,在進行一個大專案開發。其中涉及多語言協同開發。主要是c#dll和c++dll的開發和應用,其中,需要在c++中呼叫c#dll的內容。現在把開發中的經驗、教訓和注意事項總結整理如下,希望對其他人能有所幫助。           1.建立c#dll,

java呼叫C/C++編寫的生成的動態連線庫dll檔案介面的簡單例子

1、首先用java編寫一個簡單類 public class Hello { public native void sayHello(); static { System.loadLibrary("HelloDll"); } public static void

C# 呼叫 C++ dll 動態連結庫多個函式時全域性變數的問題

    最近編寫C#程式呼叫C++語言的演算法庫,自己嘗試在C++中封裝好DLL庫,並在一個工程檔案中同時匯出多個函式供C#呼叫。多個函式之間需要相互通訊,但又不能互相呼叫,,一個很好的方法就是用全域

C#呼叫C++dllC++char*C#型別的對應關係

最近在編寫C#上位機應用程式,需要呼叫C++的dll,期間遇到dll介面庫中char*型別糾結了很久,試過string,StringBuilder,StringBuilder結果都以失敗告終,通過查詢部落格等資料最後找到了救命稻草---IntPtr。例子如下: C++dll

c++建立呼叫dll

好處想必不用說了,所謂的黑盒複用,實現模組化的同時避免原始碼暴露等。可以將某一通用功能做成模組,方便複用,同時軟體更新時如果只更新了幾個模組,可以更換dll即可,無需完整地更新,便於程式拓展。以下教程基於VS2015,其他的版本類似。文章參考連結 1.dll的