2015-01-02 35 views
1

我在C中創建了一個.dll文件,其中有函數通過調用其地址來更改變量。我有使用某些功能的用C一段代碼:在matlab中調用C函數的變量地址

char logfile[1000] = "i.log"; 
bool bRet = OpenDevice(logfile); 
//FindHardware 
int model; 
int *ptr = &model; 
char name_buffer[1000], sn_buffer[1000]; 
FindHardware(ptr, name_buffer, 1000, sn_buffer, 1000); 
printf("Hardware found: %s", name_buffer); 

模型變量與name_buffer和sn_buffer改變沿。現在,我試圖複製了MATLAB這個代碼,我fiqured這應該工作完全一樣:

header = 'header.h'; % url for header 
dll = 'dll.dll'; % url for .dll 
loadlibrary(dll, header); 

logfile = 'i.log'; 
bRet = calllib('dll', 'OpenDevice', logfile); 

model_number = 0; 
% FindHardware 
name_buffer = blanks(1000); 
sn_buffer = blanks(1000); 
model_number_pointer = libpointer('int32Ptr', model_number); 
calllib('dll', 'FindHardware', model_number_pointer, name_buffer, 1000, sn_buffer, 1000); 

但沒有一個變量被改變。我想它與我創建的指針有關,還有其他方式可以訪問model_number的地址嗎?

+0

你的意思是'model_number_pointer.Value'仍然是0?爲什麼沒有針對其他值的指針? – chappjc

回答

0

我無法相信自己搜索了50多頁,直到我終於找到了答案。很簡單,Matlab返回calllib中調用的函數的每個參數,並將其作爲數組返回。所有我需要做的是:

[irrelevant, model_number, name_buffer, sn_buffer] = calllib('dll', 'FindHardware', 0, blanks(1000), 1000, blanks(1000), 1000); % bufferSize should be atleast 16 bytes long 

和所有正確的變量都爲MODEL_NUMBER返回,name_buffer和sn_buffer

0

我認爲您可能需要使用MATLAB's pointerslib.pointer類,用於所有輸出參數。您可能還需要設置每個數據類型。

model_number = int32(0); 
modelPtr = libpointer('int32Ptr',model_number); 

name_buffer = blanks(1000); 
nameBufPtr = libpointer('stringPtr',name_buffer); 

sn_buffer = blanks(1000); 
snBufPtr = libpointer('stringPtr',name_buffer); 

calllib('dll', 'FindHardware', modelPtr , nameBufPtr , 1000, snBufPtr, 1000); 

這有幫助嗎?也許libfunctionsview dll將闡明正確的語法。您可能還希望獲得輸出參數以幫助調試(out = calllib(...))。

+0

嘿謝謝你的幫助,但我已經嘗試過這條路線。如果你用get(ptr,'Value')返回值,但它不能用char *(stringPtr返回** char),那麼得到大多數值是很有用的。無論如何,我發現的答案比創建指針要簡單得多。 –

+0

@AbsentLung我很高興工作。注意我建議查看'calllib'的輸出參數,但我不知道它是如何映射每個輸入的。好的信息,謝謝。 – chappjc