• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:メモリに格納される文字列のバイト数とnullのことで)

メモリに格納される文字列のバイト数とnullのことでICカードへアクセスするPC/SC関数に関する疑問

このQ&Aのポイント
  • ICカードへのアクセスに関わるPC/SC関数であるSCardGetCardTypeProviderNameの動作について、特にchProviderとszProviderの値について疑問があります。
  • SCardGetCardTypeProviderName関数を実行すると、変数szProviderに格納されている文字列のバイト数が変数chProviderに格納されるはずですが、実際にはchProviderには15が格納されているのに、szProviderはnullのままです。
  • なぜszProviderがnullのままなのに、chProviderには値が格納されているのでしょうか?解決方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> LPTSTR szProvider = NULL; > という宣言をしてます。ポインタ宣言ですが、これがおかしいですかね? たぶんおかしい。ここに答えが格納されるんだろうと思います。確認してください。 もしそうなら、答えの格納十分な領域を用意し、zProviderがそこを指すように。

zerosix
質問者

お礼

領域が十分に確保されていなかったのが原因のようです。 mallocでszProviderのメモリを確保したらうまくいきました。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

szProvider の'型'は何ですか? 察するに szProvider が示す領域に何らかの 情報が書き込まれるようですが、szProviderは 十分な大きさの領域を指していますか?

zerosix
質問者

補足

お返事ありがとうございます。 LPTSTR szProvider = NULL; という宣言をしてます。ポインタ宣言ですが、これがおかしいですかね? MSDNには、 LONG SCardGetCardTypeProviderName( IN SCARDCONTEXT hContext, IN LPCTSTR szCardName, IN DWORD dwProviderId, OUT LPTSTR szProvider, IN OUT LPDWORD pcchProvider ); というヘルプがあるので、szProviderをLPTSTR 型で 切ったんですが。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字列を分割して変数に格納したい

    文字列を分割して変数に格納したいのですがうまくいきません。 ---以下ソース--- #include <stdio.h> #include <string.h> void main(void){ char tai[]="name1=value1&name2=value2&name3=value3&name4=value4"; char *tp; int a; int b; int i; int co=0; a=strlen(tai); for(i=0;i<a;i++){ if(tai[i] == '='){ co++; } } b=co; char *nameset[b]; char *valueset[b]; *nameset[0]=*strtok( tai,"&=" ); i=1; co=0; while ( tp != NULL ) { if(0==i%2){ co=i/2; *nameset[co] = *strtok( NULL,"&=" ); } else{ co=i/2; *valueset[co] = *strtok( NULL,"&=" );} i++; } for(i=0;i<b;i++){ printf("%s : %s\n",nameset[i],valueset[i] ) } } ---ソースここまで--- どうしたらちゃんと変数に格納されますか?

  • LPTSTR型の変数に文字を格納

    LPTSTR型の変数に文字を格納 現在C言語でWindowsプログラミングを学習しています。 LPTSTR 型の変数にキーボードから入力されて1文字づつ格納したいのですが、 下記のコードであればうまくいきません。 自分がTCHARやLPTSTRのことを根本から理解できていないのが原因だと思うのですが。 LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) { static LPTSTR buffer; HDC hdc; PAINTSTRUCT ps; switch(msg){ case WM_CHRAR: *buffer++=(TCHAR)wp; InvalidateRect(hWnd,NULL,TRUE); return 0; case WM_PRINT: hdc=BeginPaint(hWnd,&ps); DrawText(hdc,buffer,-1,&rc,DT_WORDBREAK); EndPaint(hWnd,&ps); return 0; ・ ・ ・ ・

  • 文字列がNULLか空文字列かの判定

    Visual C++で、Cのプログラムを作成しているものです。(OS:WinNT 4.0) 文字列の扱いについて、質問します。 関数 int func(char *str) があると仮定します。 パラメータとして、strは以下のような状態あるとします。 (strは関数が呼ばれる前にcalloc()で領域確保済み)  シンボル名 値  str      0x00000001 "" 上記の状態で、strがNULLか空文字列("")であることを条件式にしたいのですが、str == NULL は偽となり、strcmp(str, "") を使用すると異常終了します。 どうしたらよいのでしょうか。アドバイスをお願いします。

  • ファイルから構造体へデータを格納(動的メモリ割り当て)

    C言語の勉強をしいております。 typedef struct address { char names[32]; /* 名前 */ char tels[32]; /* 電話番号 */ struct address *prev; /* 前のリスト */ struct address *next; /* 次のリスト */ }Address; という構造体へ、ファイルから読み込んだテキストデータ(名前と電話番号がTABで区切られている)を格納したいのですが、配列ではなく、動的にメモリを確保しながら格納する方法を教えていただけないでしょうか? 処理の流れとしては、 ・1つめの構造体の*prevにはnullを入れておく。 ・1つめの構造体へファイルの1件目のデータを格納する。 ・ファイルのデータがまだある場合には、malloc関数を使ってメモリを確保し、malloc関数からの戻り値を1つめの構造体の*nextへ格納する。 ・構造体へ2件目のデータを格納する。 このような感じだろうという程度しか分からず、ソースも書けずにいます・・・。 配列を使用したサンプルはあるんですが、動的に処理を行う方法を教えていただけないでしょうか? よろしくお願いいたします。

  • 読込んだ文字列でDeleteFileWを使うには

    Visual Studio2005を用いて、Windows Mobile上で動作するWin32アプリケーションを コーディングしています。言語はC++を選択しています。 DeleteFileW関数で困っており、みなさんのご意見を聞かせていただきたいと思います。 よろしくお願いします。 ・PGの概要 ファイルに書かれている内容(削除したいファイルのパス及びファイル名)を読み込んで、 該当するファイルをDeleteFileW関数で削除するというものです。 ・困っている点 読み込んだ文字列をANSIからUnicodeに変換しても(下記のdelete_file1())、 パスを記載したファイルをUnicodeで作成して読み込んでも(下記のdelete_file2())、 ファイルを削除できません。 コンパイルは正常にできるので、何が悪いのかわかりません。 ・コード #include<windows.h> #include<norify.h> #include<stdio.h> //ANSIで読み込んだ文字列をUnicodeに変換して指定したファイルを削除する int delete_file1() { FILE *fp; char readString[42] = ""; TCHAR readString2[42] = L""; if((fp = fopen("\\Storage Card\\test.txt", "r")) == NULL) { MessageBoxW(NULL, L"open_error", L"open_error", 0); } fgets(readString, 42, fp); { #ifdef UNICODE MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, readString, 42, readString2, sizeof(readString)); #else strcpy(readString2,readString); #endif if( DeleteFileW(readString2) == TRUE) { MessageBoxW(NULL, readString2, L"delete_OK", 0); }else{ MessageBoxW(NULL, readString2, L"delete_NG", 0); } return 0; } //中身がUnicodeで書かれたファイルを読み込んで指定されたファイルを削除する int delete_file2() { HANDLE hand; hand = CreateFile(L"\\Storage Card\\testread.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); TCHAR readString[MAX_PATH]; DWORD dword; ReadFile(hand, readString, sizeof(readString), &dword, NULL); CloseHandle(hand); if( DeleteFileW(readString) == TRUE) { MessageBoxW(NULL, readString2, L"delete_OK", 0); }else{ MessageBoxW(NULL, readString2, L"delete_NG", 0); } return 0; } //メイン関数 int WinMain(HINSTANCE hInstance, HINSTANCE hPreinstance, LPWSTR lpCmdLine, int nShowCmd) { //動作を確認したい方をコメントアウトから外して実行 // delete_file1(); // delete_file2(); return 0; }

  • C++ 文字列とポインタ、STL::mapについて

    C++でポインタと文字列の受け渡しについて質問です。 MyData::search()は文字列を受け取ってメンバ変数 dict内の ヒットしたデータの グループ(文字列)を返すメンバ関数です。 メンバ変数 dict はSTLのmapを使っています。 void MyData::search( const char* funcbox, const char* result ){ for ( map<const char*, const char*>::iterator itr = dict.begin(); itr != dict.end(); ++itr ){ const char* a_name = itr->first; const char* a_group = itr->second; if ( strstr( a_name, funcbox) ){ result = a_group; return; } } result = NULL; } MyData::dict["yamada"] = "groupA"; const char* res = NULL; MyData::search("yamada", res); cout << " group = " << res << endl; 上のようにアクセスするとメンバ関数内では res == "groupA" となりますが、 関数から出るとresはNULLになってしまいます。 res に関数を抜けた後も消えないアドレスを渡すにはどうすればよいでしょうか?

  • トークンで分けた文字列をさらにトークンで分ける

    初心者です。よろしければご教授下さい。 temp.c:12: warning: useless keyword or type name in empty declaration というような文字列がg_str02[0]に格納されている時に、まずは「 」(半角スペース)を区切り文字としてトークンごとに分け最初の2つのトークンをmretsu1[0]とmretsu1[1]の中に格納し、さらにmretsu1[0](上記で言う「temp.c:12:」)を「:」を区切り文字としてトークンごとに分けmretsu2[0]とmretsu2[1]に格納するような関数を作りたいのですが、コンパイルは成功するのですが、できた実行ファイルを実行するとエラーが起きて強制終了されてしまいます。 現在ソースは以下のようになっています。 ////////// char mretsu1[255][255]; char mretsu2[2][255]; char *token1 = " "; char *token2 = ":"; strcpy(mretsu1[0], strtok(g_str02[0], token1)); strcpy(mretsu1[1], strtok(NULL, token1)); strcpy(mretsu2[0], strtok(mretsu1[0], token2)); strcpy(mretsu2[1], strtok(NULL, token2)); ////////// デバッグをしてみた所、どうもmretsu1[0]をさらに分解しているところにエラーがあるようです。 よろしくお願いします。

  • sprintfを用いたフォーマット文字列攻撃

    sprintfを用いたフォーマット文字列攻撃に関する質問です。 main文の中で --------------------- int main(void){ char str[50]; sprintf(str,"%s"); puts(str); } --------------------- を実行すると(null)で帰ってきます。 しかし関数呼び出しを行うと結果が変わってきます。 --------------------- void f(){ char str[50]; sprintf(str,"%s"); puts(str); } int main(void){ f(); } --------------------- これを実行すると" ・L "のような文字化けしたものに変わりました。 sprintf(str,"%s%s");と記述することによって" ・L (null) "と、本来呼び出される箇所のものが格納されています。 なぜ関数呼び出しにすると変なところを参照してしまうのか(第3引数があると勘違いしてしまうのか)教えてください。 また、これによりどのような悪影響があるのか教えてください。 自分はプログラマが意図しない箇所を参照するため攻撃者のプログラムアドレスを格納してしまう恐れがあると考えています。

  • ポインタによる文字列の出力

    こんにちは、お世話になっています。 この参考書のプログラムの例題のソースを実行しようとしたのですが、 Visual Studioを使っているのですが、警告がなぜか出てしまいます。 プログラム力もそんなにないので何が原因か解りません。 ご教示お願いします。 #include<iostream> using namespace std; int main() { char* str = "Hello"; ←ここでエラー cout << str << '\n'; return 0; } 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー (アクティブ) E0144 型 "const char *" の値を使用して型 "char *" のエンティティを初期化することはできません

  • テキストファイルから文字列を読み込んで二次元配列に格納するには

    毎回お世話になっています。 ただいまC言語を勉強中の学生です。 基本的な文法は頭に入れたつもりでしたが、まだポインタと ファイルの入出力に苦手意識があり 実際うまくできないでいるので どなたか ご存知の方にアドバイスいただければと思って書き込ませていただきます。 今回練習しているのは 先に述べたように、テキストファイルに abc def ghi jkl などと文字列を書いておき、そのファイルを読み込んで 二次元配列に格納したいのですが、何を勘違いしているのか、 うまく実現できません。 参考書などを見て 一次元配列へ格納する場合は できたようなのですが、今後このプログラムを発展させる段階で 二次元配列に文字列を 格納できたほうが好都合なので 今模索しています。。。 ちなみに 一次元配列に格納する場合は 以下のように書きました。 #include<stdio.h> #include<stdlib.h> main() { char a[10]; FILE *fp; fp = fopen("word.dat", "r"); if (fp == NULL) { printf("File does not exist.\n"); exit(1); } while(fscanf(fp,"%s",a)==1){ printf("%s\n",a); } fclose(fp); return 0; } 実はコレに関しても分からない点があり、それは 目的の配列変数 a[]に格納できたのだから それを確認したいと思い printfで a[0]~a[10]を表示してみようとしたところ 変に文字化け したものが表示されたり、何も表示されなかったり よく分からないことが起きます。私は何を勘違いしてしまっているのでしょうか(>_<) 長々と書いてしまいましたが、今回 御教授いただきたいのは (1)、テキストファイルから 英字の文字列を読み込んで二次元配列に格納するために用いるのに 一番最適な関数はどれか(fscanfやfgetsなど) そして、その関数を使って 一番シンプルな記述をするにはどのように記述すればよいのか (2)、上のようなプログラムの書き方で、配列aにテキストファイルから読み込んで格納できたようなのに、a[0]~a[10]をprintfしたときに うまく中身が表示されないのはなぜか。 という点なのですが、(1)をとりあえず急いでおりますので、(2)はおまけ程度に考えていただければと思います。 なぜかファイルの入出力がいまだに把握できなくて苦手としておりますので、どうか よろしくお願いいたします。