0

私はDLLを持っています

A.dll

これはああ

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef __cplusplus
#define DLL_EXPORT extern "C" __declspec(dllexport) 
#else
#define DLL_EXPORT __declspec(dllexport)
#endif

DLL_EXPORT void function();
DLL_EXPORT char ** ReturnArr;

これはアクです

void function()
{
char *str = "hello";
char *str1 = "how are you?";
ReturnArr = (char **)malloc(sizeof(char*) * 2);
for(;j<2;j++)
{
ReturnArr[j] = (char *) malloc(256);
if(NULL == ReturnArr[j])
break;
}
strcpy(ReturnArr[0],"str");
strcpy(ReturnArr[1],"str1");
}

今、私はdllを使用するApplication.cを持っています

#include <windows.h>
#include <stdio.h> 

typedef int (__cdecl *MYPROC)(LPWSTR); 

_declspec(dllimport) char ** ReturnArr;

int main( void ) 
{ 
HINSTANCE hinstLib; 
MYPROC ProcAdd;
int a = 0;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; 

// Get a handle to the DLL module.

hinstLib = LoadLibrary(TEXT("A.dll")); 

// If the handle is valid, try to get the function address.

if (hinstLib != NULL) 
{ 
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "function"); 

// If the function address is valid, call the function.
if (NULL != ProcAdd) 
{
fRunTimeLinkSuccess = TRUE;
(ProcAdd) (L"Message sent to the DLL function\n"); 
printf("%s",Returnarr[0]);
}

fFreeResult = FreeLibrary(hinstLib); 
} 

// If unable to call the DLL function, use an alternative.
if (! fRunTimeLinkSuccess) 
printf("Message printed from executable\n"); 

return 0;

}

Visual studio で CommonProperties->references:A.dll を追加し、コンパイラ ##error Error 1 error LNK2001: unresolved external symbol "__declspec(dllimport) char * #* ReturnArr" (_ imp ?ReturnArr@@3PAPADA)" を表示しましたおよび「エラー 2 致命的なエラー LNK1120: 1 つの未解決の ##externals」

グローバル変数を実際にエクスポートしてアプリケーションで使用するにはどうすればよいですか、アプリケーションで ReturnArr をグローバル変数として実際に出力する方法を教えてください

ありがとう

4

1 に答える 1

0

リンカーで ReturnArr インポート変数を解決する場合は、A.LIB をリンク プロセスに追加する必要があります。これを行うにはいくつかの方法があります。

  1. 構成プロパティ->リンカー->入力の「追加の依存関係」にA.LIBを追加します
  2. Application.c に #pragma comment( lib, "a.lib" ) を追加
  3. DLL プロジェクトを EXE プロジェクトと EXE プロジェクトの依存関係にし、[構成プロパティ] -> [リンカー] -> [一般的な "ライブラリの依存関係をリンクする"] を [はい] に設定します。

補足:

  1. 本当に必要ですか strcpy(ReturnArr[0],"str"); ? strcpy(ReturnArr[0],str); の可能性があります。(str を囲む引用符なし)
  2. A に静的にリンクする場合、LoadLibrary と GetProcAddress は必要ありません。
  3. _declspec(dllimport) char ** ReturnArr; を抑制することもできます。
  4. MYPROC の typedef が間違っています。「関数」の戻り値の型は int ではなく void です
  5. EXE に ReturnArr を知らせたい場合は、それを関数の戻り値にするだけです。

何をしようとしているのかを正確に説明するよう努めるべきです

于 2013-10-28T09:57:36.927 に答える