c 與c 互動的一些東西

2022-07-27 23:27:15 字數 2670 閱讀 1572

最近做乙個專案,對方公司只提供了乙個c++的dll,但沒封住,c#無法dllimport.所以只能自己寫c++來封住了。

對方的dll只接收yuv420的格式,所以在c++裡用opencv來轉換。本來想c#來寫,但總覺得麻煩。

【c#】**

public void do(bitmap bp)

bitmap outimg = new bitmap(bp.width,bp.height);

system.drawing.imaging.bitmapdata bmpdata = bp.lockbits(new system.drawing.rectangle(0, 0, bp.width, bp.height), system.drawing.imaging.imagelockmode.readwrite,

bp.pixelformat);

system.drawing.imaging.bitmapdata bmpdata1 = outimg .lockbits(new system.drawing.rectangle(0, 0, outimg .width, outimg .height), system.drawing.imaging.imagelockmode.readwrite,

outimg .pixelformat);

cfunction(bmpdata.scan0, bp.width, bp.height, 3, 0,bmpdata1.scan0);

img.unlockbits(bmpdata);

outimg.unlockbits(bmpdata1 );

【c++】**

extern "c" __declspec(dllexport) void winapi cfunction(unsigned char* img,int width,int height,int ch,int format,unsigned char* outimg)

這基本實現了c++和c#直接的對接。但是這種做法會卡c#的程式,我試過backgroundworker,task,很多種方法,但是c#就是會卡住的。具體原因不太清楚,所以覺得這部分的處理在c++中用執行緒來做,

做完之後通知c#,因為我需要在第三方dll來生成四個結果。所以定義了結構體。

【c#】

[structlayout(layoutkind.sequential)]

public struct imageresult

【c++】

struct imgeresult

;接著要在c#做定義給c++**的委託。

【c#】

public delegate void cscallback(imageresult ir);

public static cscallback callback;

callback = cscallbackfunction;

setcallback(callback );

public static void cscallbackfunction(imageresult tick)

呼叫c++執行緒函式

public void do(bitmap bp)

bitmap outimg = new bitmap(bp.width,bp.height);

system.drawing.imaging.bitmapdata bmpdata = bp.lockbits(new system.drawing.rectangle(0, 0, bp.width, bp.height), system.drawing.imaging.imagelockmode.readwrite,

bp.pixelformat);

doimage(bmpdata.scan0, bp.width, bp.height, 3, 0,bmpdata1.scan0);

img.unlockbits(bmpdata);

outimg.unlockbits(bmpdata1 );

【c++】

typedef void(__stdcall *cppcallback)(imgeresult ir);

cppcallback mycallback;

extern "c" __declspec(dllexport) void winapi setcallback(cppcallback callback)

void  operateimage(unsigned char* img,int width,int height,int ch,int format)

extern "c" __declspec(dllexport) void winapi doimage(unsigned char* img,int width,int height,int ch,int format)

到此不會卡住c#程式。

由於本人第一次用c++,也是一邊查,一邊寫的。

c++寫的一些心得.

(1)使用opencv要注意鏈結庫是debug還是release的。

(2)到純淨系統下要安裝redist,我的目標機是64位,開發環境是2013,所以要裝vs2013redist.

(3)最後要注意將 msvcp120.dll,msvcp120d.dll,msvcr120.dll,msvcr120d.dll,vccorlib120.dll,vccorlib120d.dll放到c:\windows\syswow64目錄下,32位的目標機器則放到win32下面。

如果有更好的辦法,請告訴小弟。

C 一些有用的東西

雜 1.自定義控制項public屬性如何不在initializecomponent中生成?可以使用特性 designerserializationvisibility designerserializationvisibility.hidden 2 在一些無法在窗體內捕獲的事件可以使用imessag...

C中經常忘記的一些東西

這些東西總是忘記,大概也是 敲的少的原因,還是先記下,方便檢視,也會不定期更新,有錯誤希望看到的人可以指正,願共同進步o o 一 被調函式能不能改變主調函式中變數值的問題 被調函式能修改主調函式中普通變數值的情況 1.實參必須為該普通變數的位址 2.形參必須為普通變數 3.在被調函式中通過 形參名 ...

C 與C的一些知識

cout 其中的cou 是outstream 類的乙個物件 而 是這個類的運算子過載,嗯,我們已經基本上看出了cout的實質,不妨動動手,自己來實現乙個cout的簡化版 lite 為了區分,我們把我們設計的cout物件命名的myout,myout物件所屬的類為myoutstream。我們要做的就是為...