1

私は問題があります。私のdllには、次のように定義されている関数があります。

int function(char *inVal, char *outVal, int *retVal)

LoadLibraryを使用してコンソールアプリケーションにdllを正常にロードし、関数ポインターを使用して関数を呼び出します。

typedef int (__cdecl *functionPtr)(char *, char *,int *);

次に、inValを関数に渡します。

char * inVal = "input";

ここで、outValとretValを取得したいのですが、retValは正常に取得されましたが、outValはNULLです。

int retVal = 0;
char outVal[200] = {0};

次に、関数を呼び出します。

int return = functionLNK(inVal , outVal, &retVal)

どんな手掛かり?!!

編集1:

コードは次のとおりです。

int function(char *inVal, char *outVal, int *retVal) 

{

PKI_Buf inBuf, signBuf, pemBuf;

......


outVal = (char*)pemBuf.data;

//I check outVal in this point and it is not NULL

}
4

1 に答える 1

3

問題はfunction. 値で渡しoutValます。つまり、関数内にあるポインターは、渡したポインターのコピーです。次に、そのポインターにoutVal = (char*)pemBuf.data;. コピーを変更しただけです。外側に変化はありません。

ただし、これはあなたのアプローチの唯一の問題ではありません。また、スコープ外に出ようとしているオブジェクトのメンバーにポインターを渡そうとしています。pemBufには自動保存期間があります (これは に対してローカルであるためfunction)。これは、返されたときに破棄されることを意味します。次に、ポインターが無効なオブジェクトを指しています。

代わりに、 over の内容を がpemBuf.data指す配列要素にコピーしoutValます。std::copyまたはでこれを行うことができますstrcpypemBuf.dataただし、バッファのサイズを渡さないという別の問題があります(配列のサイズはわかりません)。ただし、としてコピーする量がわかっていると仮定するとN、次のことができます。

std::copy(pemBuf.data, pemBuf.data + N, outVal);

ただし、コードは非常に C に似ており、C スタイルの文字列や出力パラメーターなどを使用しています。を使い始めることをお勧めしますstd::string

于 2013-02-23T15:00:24.240 に答える