2014-03-12 83 views
1

我已經developped在C DLL和我呼籲我的C++程序使用此方法如何調用用C++編程調用我的DLL用C語言編寫

#include <cstdlib> 
#include <iostream> 
#include <windows.h> 

#ifdef __cplusplus 
extern "C" { 
#endif 
#include "mydll.h" 
#ifdef __cplusplus 
} 
#endif 
using namespace std; 

int main(int argc, char *argv[]) 
{ 
    struct myown_struct *ss = NULL; 
    int i = 0,j = 0, result = 0; 
    struct myown_struct2 *s = NULL; 
    myfunction("string1", "string2", "string3", 1500); 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

mydll.h:

#ifndef _DLL_H_ 
#define _DLL_H_ 

#if BUILDING_DLL 
# define DLLIMPORT __declspec (dllexport) 
#else /* Not BUILDING_DLL */ 
# define DLLIMPORT __declspec (dllimport) 
#endif /* Not BUILDING_DLL */ 

struct myown_struct { 
    int fd; 
    char buf[32]; 
    unsigned int len; 
} __attribute__((packed)); 

DLLIMPORT void myfunction(char *s1, char* s2, char *s3, int n); 

#endif /* _DLL_H_ */ 

我得到這個錯誤:

C:\用戶\用戶01 \桌面\測試\ main.cpp中在功能int main(int, char**) C:\用戶\用戶01 \桌面\測試\ main.cpp中myfunction' undeclared (first use this function)

我該如何解決它?

+0

向我們展示mydll.h?看起來您的使用不符合標題中的簽名或者未在標題中聲明。 – crashmstr

+0

@crashmstr:你可以看到我的更新 – developer

回答

2

你的頭文件mydll.h似乎缺少聲明myfunction。糾正遺漏和您的代碼將編譯。

最重要的是,你需要確保:

  • 當你編譯當你鏈接你的C++程序的DLL被傳遞給鏈接已創建的.LIB導入庫。
  • 當您嘗試運行程序時,可以找到DLL。這最好通過將DLL放在與可執行文件相同的目錄中來實現。

我也評論說,我希望看到在頭文件中extern "C"而不是強迫頭文件中的每一個用戶寫extern "C"。頭文件真的應該獨立。

+0

我不會錯過'mydll.h'中'myfunction'的聲明。 – developer

+0

如果那是真的,那麼你的編譯器就壞掉了。也許你可以應該你的頭文件。 –

+0

你可以看到我的問題更新 – developer

1

由於您使用VC++,可以使用現有的API對同一

typedef void (*myfunction)(char *buf1, char *buf2,char *buf3,char *buf4); 
HMODULE hModule = LoadLibrary(_T("mydll.dll")); 
if(hModule!=NULL) 
    myfunction GetMyFunction = (myfunction) GetProcAddress(hModule,"myfunction"); 

現在使用GetMyFunction()

希望這將有助於

+0

雖然這可以工作,但我沒有看到任何理由使用此DLL的運行時加載的DLL。 – crashmstr

+0

嘿@crashmstr ..你可以請告訴我的另一種方式,不需要在運行時加載DLL ... :-) – HadeS

+0

@HadeS加載時間鏈接。 –