拖管程式呼叫非拖管API

2021-04-19 20:11:20 字數 1406 閱讀 9388

一,在.net 2005中使用拖管c++呼叫非拖管的動態鏈結庫

現在編寫動態庫的時候就沒法使用標頭檔案來呼叫了,而且在要匯出的方法前加入extern "c"來說明一下,extern   "c"是用c語言的一些連線規則,可以防止c++編譯器對被連線的函式進行名字粉碎。也可以叫做是函式方法的入口,標頭檔案就可以不要了;

1》dlltest.cpp**如下:

#define flsmanagement_api _declspec(dllexport)

extern "c" flsmanagement_api int add(int a,int b)

return a+b;

2》在.net 2005中新建乙個asp.net webservice命名為testweb先生成一次,這裡要注意的是,要將1》中生成的dlltest.dll拷貝到testweb的執行目錄的bin下,預設一般在c:/inetpub/wwwroot中,在testwebclass.h中,**如下:

首先引入乙個命名空間

using namespace system::runtime::interopservices;

在類中加入如下**

[dllimport("dlltest.dll", entrypoint = "add", setlasterror = true,

charset = charset::unicode, exactspelling = true,

callingconvention = callingconvention::stdcall)]

static int getresult(int a, int b);

在testwebclass.cpp中,這裡就可以在生成的helloworld方法中加入如下**:

int i = 0;

trycatch(exception^ e)

string^ str = i.tostring();

return str;

編譯執行後就可以的到正確的結果了。測試完成。

讀取的方式和很多種,用的比較多的是引用using namespace system::configuration;

三,webservice中呼叫外部應用程式

在webservice被訪問的時候,呼叫乙個外部的應用程式,而且如果有乙個例項在執行,則不會再呼叫

using namespace system::diagnostics;

array^ ru = process::getprocessesbyname("flsoperate");

if(ru->length < 1)

有乙個問題(還沒有解決)在webservice中呼叫.exe,資源管理器中可以看到執行的程序(如flsweboperate)但是窗體出不來,同樣的應用程式,如果使用別的應用程式呼叫的話,窗體出來的非常正常;還沒找到原因,以及解決辦法。

使用拖管和執行緒

delegate void mydelegate mainf f 定義拖管 引數為mainf型別 thread t 宣告執行緒 public void threadstart 執行緒啟動擊需要的函式引數 thread.sleep 1000 迴圈執行執行緒中的createform函式 createfo...

C 關於託管程式和非託管程式的區別

一般的乙個可執行檔案的內容都包含乙個pe頭,系統根據pe的資訊找到入口函式,通過執行入口函式中的 來執行可執行程式。託管程式的檔案相對於非託管程式還包含了乙個clr表頭檔案以及其他clr需要的資訊。1.非託管程式的執行過程 在非託管程式中,可執行裡面儲存的是機器 cpu可以直接載入並執行,當系統載入...

從C 程式中呼叫非受管DLLs

using system.runtime.interopservices dllimport所在的名字空間 structlayout layoutkind.sequential public struct system power status dllimport kernel32 public s...