線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1434
推到 Plurk!
推到 Facebook!

DLL 傳回 byte陣列問題

 
chenjeff622
一般會員


發表:3
回覆:2
積分:1
註冊:2005-02-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-09-08 13:36:41 IP:218.210.xxx.xxx 訂閱
各位先進好!目前我們設計了一個DLL元件,這個元件內容會產生一個8byte的陣列,但是如何將這個值利用 export傳回呼叫的主程式呢?請各位大大幫忙..

dll 原型

extern "C" __declspec(dllexport)void EncRegValue(String Manufact, String SN, String& rValue, Byte* PublicKey)

void EncRegValue(String Manufact, String SN, String& rValue, Byte* PublicKey) {

TKey64 Key64; 產生8個1byte陣列

Byte test[sizeof(Key64)];

memcpy( test, Key64 ,sizeof(Key64)); 將產生的陣列複製到 test陣列 ,請問之後如何將值放入 PublicKey讓主程式讀取?
return ;
}


主程式 :

extern "C" __declspec(dllimport)void EncRegValue(String Manufact, String SN, String& rValue, char* PublicKey);

//////////////////////////////
{
char *get_key;

String get_Enc;

EncRegValue(Edit3->Text,Edit4->Text,get_Enc,get_key);

Edit6->Text= get_Enc;
Edit7->Text= get_key;
}
//////////////////////////////
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-09-08 14:30:04 IP:219.84.xxx.xxx 未訂閱

以你函式的宣告來看,最快的方式是由呼叫的主程式配置陣列的記憶體,

然後將該記憶體的指標傳給dll,由dll寫入即可。

另一個做法是,記憶體由dll配置和寫入,最後把指標傳回給主程式,也是可行的。

chenjeff622
一般會員


發表:3
回覆:2
積分:1
註冊:2005-02-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-09-08 15:01:26 IP:218.210.xxx.xxx 訂閱
謝謝您的回覆,請問有實例可以參考一下嗎?
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-09-10 05:32:30 IP:61.229.xxx.xxx 未訂閱
你好,幫你把pwipwi的話補上例子。不過我沒試著run,純用腦子的改,也許有小bug,你再看看。


extern "C" __declspec(dllexport)void EncRegValue(String Manufact, String SN, String& rValue, Byte* PublicKey)

void EncRegValue(String Manufact, String SN, String& rValue, Byte* PublicKey) {

TKey64 Key64; //產生8個1byte陣列

Byte test[sizeof(Key64)];

memcpy( PublicKey, Key64 ,sizeof(Key64));
return ;
}


主程式 :

extern "C" __declspec(dllimport)void EncRegValue(String Manufact, String SN, String& rValue, char* PublicKey);

//////////////////////////////
{
BYTE get_key[9] = {0}; //先幫要取回的值配9個bytes的空間,並初始化為0,為何不是8?是因為你等一下把它當字串

String get_Enc;

EncRegValue(Edit3->Text,Edit4->Text,get_Enc,get_key);

Edit6->Text= get_Enc;
Edit7->Text= (char *) get_key; //轉一下型別
}
//////////////////////////////
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-09-10 08:32:04 IP:219.84.xxx.xxx 未訂閱

感謝aftcast大大的回覆,至於我說的第二個方法
"記憶體由dll配置和寫入,最後把指標傳回給主程式"
例子如下:

//---------------------------------------------------
//Dll
extern "C" __declspec(dllexport)unsigned char* EncRegValue(...)
{
static unsigned char return_buffer[8]; //return buffer can be also be placed in global
...
//several operations
...
return return_buffer;
}

//主程式
{
unsigned char* buffer= EncRegValue(..);
}

系統時間:2024-05-13 11:06:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!